Ejemplo n.º 1
0
        private void GrabBegin()
        {
            float     closestMagSq             = float.MaxValue;
            Grabbable closestGrabbable         = null;
            Collider  closestGrabbableCollider = null;
            Vector3   closestGrabbableRotation = Vector3.zero;

            foreach (Grabbable grabbable in GrabCandidates.Keys)
            {
                for (int j = 0; j < grabbable.GrabPoints.Length; ++j)
                {
                    Collider grabbableCollider = grabbable.GrabPoints[j];
                    // Store the closest grabbable
                    Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(GrabPoint.position);
                    float   grabbableMagSq       = (GrabPoint.position - closestPointOnBounds).sqrMagnitude;
                    if (grabbableMagSq < closestMagSq)
                    {
                        closestMagSq             = grabbableMagSq;
                        closestGrabbable         = grabbable;
                        closestGrabbableCollider = grabbableCollider;
                        closestGrabbableRotation = grabbable.GrabRotations[j];
                    }
                }
            }

            // Disable grab volumes to prevent overlaps
            GrabVolumeEnable(false);

            if (closestGrabbable != null)
            {
                if (closestGrabbable.IsGrabbed)
                {
                    closestGrabbable.GrabbedBy.OffhandGrabbed(closestGrabbable);
                }

                Grabbable = closestGrabbable;
                Grabbable.SetLayer(GrabbableLayerInt);
                Grabbable.GrabBegin(this, closestGrabbableCollider, closestGrabbableRotation);

                // Set up offsets for grabbed object desired position relative to hand.
                GrabObjectPosOffset = -Grabbable.GrabbedCollider.transform.localPosition;
                GrabObjectRotOffset = Quaternion.Euler(Grabbable.GrabbedRotation);

                // TODO: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high
                // speed and sends them flying. The grabbed object may still teleport inside of other objects.
                MoveGrabbedObject(GrabPoint.transform.position, GrabPoint.transform.rotation);

                RenderersEnable(false);
            }
        }
Ejemplo n.º 2
0
 private void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity)
 {
     Grabbable.SetLayer(Grabbable.DefaultLayer);
     Grabbable.GrabEnd(linearVelocity, angularVelocity);
     Grabbable = null;
 }