using Microsoft.MixedReality.Toolkit.Input; using Microsoft.MixedReality.Toolkit.Utilities; using UnityEngine; public class ObjRotateController : MonoBehaviour { private float flatHandThreshold = 45.0f; /// /// 手掌向上的法线与摄像头向前射线的夹角 /// private float facingCameraTrackingThreshold = 80.0f; /// /// 是否要求手指打开 /// private bool requireFlatHand = true; private bool IsPalmMeetingThresholdRequirements() { MixedRealityPose palmPose; if (requireFlatHand) { MixedRealityPose indexTipPose, ringTipPose; Handedness handedness = Handedness.Left; if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out indexTipPose) && HandJointUtils.TryGetJointPose(TrackedHandJoint.RingTip, Handedness.Right, out ringTipPose) && HandJointUtils.TryGetJointPose(TrackedHandJoint.Palm, Handedness.Right, out palmPose)) { var handNormal = Vector3.Cross(indexTipPose.Position - palmPose.Position, ringTipPose.Position - indexTipPose.Position).normalized; handNormal *= (handedness == Handedness.Right) ? 1.0f : -1.0f; if (Vector3.Angle(palmPose.Up, handNormal) > flatHandThreshold) { return false; } } } if (HandJointUtils.TryGetJointPose(TrackedHandJoint.Palm, Handedness.Right, out palmPose)) { float palmCameraAngle = Vector3.Angle(palmPose.Up, CameraCache.Main.transform.forward); return palmCameraAngle < facingCameraTrackingThreshold; } return false; } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }