예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }
예제 #3
0
        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);
        }