コード例 #1
0
        public override bool IsGesturePoseHeld(Hand leftHand, Hand rightHand,
                                               out Vector3 positionOfInterest)
        {
            var leftHandStraightAmount  = 1f - leftHand.GetFistStrength();
            var rightHandStraightAmount = 1f - rightHand.GetFistStrength();

            var isLeftHandStraight  = leftHandStraightAmount > 0.80f;
            var isRightHandStraight = rightHandStraightAmount > 0.80f;

            if (drawHeldPoseDebug)
            {
                RuntimeGizmoDrawer drawer = null;
                if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                {
                    drawer.DrawBar(leftHandStraightAmount,
                                   Vector3.down * 0.2f + Vector3.left * 0.20f,
                                   Vector3.up,
                                   isLeftHandStraight ?
                                   LeapColor.white
                        : LeapColor.amber,
                                   scale: 0.2f);
                    drawer.DrawBar(rightHandStraightAmount,
                                   Vector3.down * 0.2f + Vector3.left * 0.10f,
                                   Vector3.up,
                                   isRightHandStraight ?
                                   LeapColor.white
                         : LeapColor.brown,
                                   scale: 0.2f);
                }
            }

            var areThumbsParallel = Vector3.Angle(leftHand.RadialAxis(),
                                                  rightHand.RadialAxis()) < MAX_ALIGNED_ANGLE;

            var leftMiddleTip            = leftHand.Fingers[2].TipPosition.ToVector3();
            var rightMiddleTip           = rightHand.Fingers[2].TipPosition.ToVector3();
            var areMiddleFingersTouching = (leftMiddleTip - rightMiddleTip)
                                           .sqrMagnitude < MAX_TOUCHING_DISTANCE_SQR;

            var handsAngle = Vector3.SignedAngle(rightHand.DistalAxis(),
                                                 leftHand.DistalAxis(),
                                                 rightHand.RadialAxis());
            var areHandsInUpwardTriangle = handsAngle.IsBetween(30f, 135f);

            positionOfInterest = Vector3.zero;
            bool isGesturePoseHeld = isLeftHandStraight &&
                                     isRightHandStraight &&
                                     areThumbsParallel &&
                                     areMiddleFingersTouching &&
                                     areHandsInUpwardTriangle;

            if (isGesturePoseHeld)
            {
                positionOfInterest = (leftMiddleTip + rightMiddleTip) / 2f;
            }

            return(isGesturePoseHeld);
        }
コード例 #2
0
        private bool updateIsRelativeHandVelocityLow(Hand leftHand, Hand rightHand)
        {
            var leftHandPos  = leftHand.PalmPosition.ToVector3();
            var rightHandPos = rightHand.PalmPosition.ToVector3();
            var leftMinusRightHandPosition = leftHandPos - rightHandPos;

            leftMinusRightHandPosBuffer.Add(leftMinusRightHandPosition, Time.time);

            if (leftMinusRightHandPosBuffer.IsFull)
            {
                var relativeHandVelocity = leftMinusRightHandPosBuffer.Delta();

                if (drawHeldPoseDebug)
                {
                    RuntimeGizmoDrawer drawer = null;
                    if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                    {
                        drawer.DrawBar(relativeHandVelocity.magnitude,
                                       (leftHandPos + rightHandPos) / 2f,
                                       Vector3.up, 0.1f);
                    }
                }

                if (relativeHandVelocity.sqrMagnitude < MAX_RELATIVE_HAND_VELOCITY_SQR)
                {
                    return(true);
                }
                else
                {
                    if (drawHeldPoseDebug)
                    {
                        DebugPing.Ping((leftHandPos + rightHandPos) / 2f, LeapColor.black, 0.2f);
                    }
                    return(false);
                }
            }

            if (drawHeldPoseDebug)
            {
                DebugPing.Ping((leftHandPos + rightHandPos) / 2f, LeapColor.gray, 0.1f);
            }

            return(false);
        }
コード例 #3
0
 public void OnDrawRuntimeGizmos(RuntimeGizmoDrawer drawer)
 {
     drawer.DrawBar(_pinchStrength, this.transform, _useColor, 0.25f);
 }
コード例 #4
0
 public void OnDrawRuntimeGizmos(RuntimeGizmoDrawer drawer)
 {
     drawer.DrawBar(_fistStrength, this.transform, color, 0.25f);
 }
コード例 #5
0
        public override bool IsGesturePoseHeld(Hand leftHand, Hand rightHand,
                                               out Vector3 positionOfInterest)
        {
            var leftThumb    = leftHand.GetThumb();
            var leftThumbTip = leftThumb.TipPosition.ToVector3();
            var leftThumbDir = leftThumb.Direction.ToVector3();

            var rightIndex    = rightHand.GetIndex();
            var rightIndexTip = rightIndex.TipPosition.ToVector3();
            var rightIndexDir = rightIndex.Direction.ToVector3();

            var tipsTouching = (leftThumbTip - rightIndexTip).sqrMagnitude
                               < MAX_TOUCHING_DISTANCE_SQR;

            if (drawHeldPoseDebug)
            {
                var touchingAmount = ((leftThumbTip - rightIndexTip).sqrMagnitude
                                      - MAX_TOUCHING_DISTANCE_SQR).Map(0,
                                                                       -MAX_TOUCHING_DISTANCE_SQR, 0, 1);
                RuntimeGizmoDrawer drawer = null;
                if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                {
                    drawer.DrawBar(touchingAmount,
                                   Vector3.down * 0.2f + Vector3.right * 0.20f
                                   + Vector3.forward * 0.1f,
                                   Vector3.up,
                                   tipsTouching ?
                                   LeapColor.white
                         : LeapColor.teal,
                                   scale: 0.2f);
                }
            }

            var tipsAligned = Vector3.Dot(leftThumbDir, rightIndexDir) < -0.70f;

            if (drawHeldPoseDebug)
            {
                RuntimeGizmoDrawer drawer = null;
                if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                {
                    drawer.DrawBar(Vector3.Dot(leftThumbDir, rightIndexDir)
                                   .Map(-1, 1, 1, 0),
                                   Vector3.down * 0.2f + Vector3.right * 0.20f,
                                   Vector3.up,
                                   tipsAligned ?
                                   LeapColor.white
                         : LeapColor.periwinkle,
                                   scale: 0.2f);
                }
            }

            var leftIndexPointAmount  = leftHand.GetIndexPointAmount();
            var rightIndexPointAmount = rightHand.GetIndexPointAmount();

            var leftIsIndexPointing  = leftIndexPointAmount > 0.80f;
            var rightIsIndexPointing = rightIndexPointAmount > 0.80f;

            if (drawHeldPoseDebug)
            {
                RuntimeGizmoDrawer drawer = null;
                if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                {
                    drawer.DrawBar(leftIndexPointAmount,
                                   Vector3.down * 0.2f, Vector3.up,
                                   leftIsIndexPointing ?
                                   LeapColor.white
                         : LeapColor.lavender,
                                   scale: 0.2f);
                }
                if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer))
                {
                    drawer.DrawBar(rightIndexPointAmount,
                                   Vector3.down * 0.2f + Vector3.right * 0.10f,
                                   Vector3.up,
                                   rightIsIndexPointing ?
                                   LeapColor.white
                         : LeapColor.red,
                                   scale: 0.2f);
                }
            }

            positionOfInterest = Vector3.zero;
            bool isGesturePoseHeld = tipsTouching &&
                                     tipsAligned &&
                                     leftIsIndexPointing &&
                                     rightIsIndexPointing;

            if (isGesturePoseHeld)
            {
                var gesturePlaneDir = Vector3.Cross(
                    leftHand.Fingers[0].Direction.ToVector3(),
                    leftHand.Fingers[1].Direction.ToVector3());
                var upPlaneDir = Vector3.Cross(gesturePlaneDir,
                                               leftHand.Fingers[0].Direction.ToVector3()).normalized;

                positionOfInterest = (leftThumbTip + rightIndexTip) / 2f
                                     + upPlaneDir * (leftHand.GetIndex().bones[1].PrevJoint
                                                     - leftHand.GetIndex().TipPosition)
                                     .ToVector3().magnitude;
            }

            return(isGesturePoseHeld);
        }