void DirectGrab() { if (isGrabbing || directGrabCandidates_.Count == 0) { return; } VrgGrabbable grabbable = null; float minDist = float.MaxValue; var gripPos = gripTransform.position; foreach (var kv in directGrabCandidates_) { var candidate = kv.Value; var pos = candidate.collider.ClosestPoint(gripPos); var dist = Vector3.Distance(gripPos, pos); if (dist < minDist) { grabbable = candidate.grabbable; minDist = dist; } } if (grabbable) { Grab(grabbable, 0f); } }
void SecondGrab(VrgGrabbable grabbable) { var primary = opposite; var secondary = this; var primaryMat = primary.grabInfo_.gripToGrabbableMat; var secondaryMat = secondary.grabInfo_.gripToGrabbableMat; var primaryPos = primaryMat.GetPosition(); var secondaryPos = secondaryMat.GetPosition(); var primaryGripPos = primary.gripTransform.position; var secondaryGripPos = secondary.gripTransform.position; primary.dualGrabInfo_.primaryToSecondary = primaryGripPos - secondaryGripPos; primary.dualGrabInfo_.pos = grabbable.transform.position; primary.dualGrabInfo_.center = (primaryPos + secondaryPos) / 2; primary.dualGrabInfo_.rot = grabbable.transform.rotation; primary.dualGrabInfo_.scale = grabbable.transform.localScale; grabInfo_.isKinematic = primary.grabInfo_.isKinematic; }
void Grab(VrgGrabbable grabbable, float distance) { grabInfo_.grabber = this; grabInfo_.grabbable = grabbable; grabInfo_.distance = distance; var grabMat = grabInfo_.grabMat; grabInfo_.initGripToGrabbableMat = grabMat.inverse * grabbable.transform.localToWorldMatrix; grabInfo_.initGrabbableToGrabMat = grabbable.transform.worldToLocalMatrix * grabMat; grabInfo_.isKinematic = grabbable.rigidbody.isKinematic; grabbable.rigidbody.isKinematic = true; if (grabbable.isGrabbed) { SecondGrab(grabbable); } grabInfo_.id = grabbable.OnGrabbed(this); }