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); }
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); }
public void OnDrawRuntimeGizmos(RuntimeGizmoDrawer drawer) { drawer.DrawBar(_pinchStrength, this.transform, _useColor, 0.25f); }
public void OnDrawRuntimeGizmos(RuntimeGizmoDrawer drawer) { drawer.DrawBar(_fistStrength, this.transform, color, 0.25f); }
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); }