コード例 #1
0
        private void RotateHandToNewPalmNormal(HandSkeleton hand, bool isLeft, Vector3 newPalmNormal)
        {
            Vector3 rotationPlane = Vector3.Cross(GetHandForward(hand.handBoneReferences), CalculatePalmNormal(hand.handBoneReferences, isLeft));

            Vector3 newHandForward  = Vector3.Cross(CalculatePalmNormal(hand.handBoneReferences, isLeft), rotationPlane);
            bool    inverseRotation = Vector3.Dot(newHandForward, Vector3.ProjectOnPlane(newPalmNormal, rotationPlane)) > 0f;

            float angleToRotate = Vector3.Angle(CalculatePalmNormal(hand.handBoneReferences, isLeft), Vector3.ProjectOnPlane(newPalmNormal, rotationPlane));

            //angleToRotate += fingerAngleOffset / 2f;
            angleToRotate *= inverseRotation ? -1f : 1f;
            angleToRotate += fingerAngleOffset;

            hand.transform.GetChild(0).rotation *= Quaternion.AngleAxis(angleToRotate, hand.transform.GetChild(0).InverseTransformDirection(rotationPlane));
        }
コード例 #2
0
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            HandSkeleton script = target as HandSkeleton;

            if (GUILayout.Button("Populate Bones"))
            {
                script.PopulateBoneReferences();
            }

            if (GUILayout.Button("Clear Bone References"))
            {
                script.ClearBoneReferences();
            }
        }
コード例 #3
0
        void OnSceneGUI()
        {
            // TODO: add undo/redo functionality
            HandSkeleton skeleton = target as HandSkeleton;

            if (skeleton == null || !skeleton.handBoneReferences.IsValid)
            {
                return;
            }

            HandBoneReferences bones = skeleton.handBoneReferences;

            if (bones.IsValid)
            {
                DrawHand(bones);
            }
        }
コード例 #4
0
        private void AlignHands(HandSkeleton leftHand, HandSkeleton rightHand)
        {
            Vector3 rightHandNormal = CalculatePalmNormal(rightHand.handBoneReferences, false);
            Vector3 leftHandNormal  = CalculatePalmNormal(leftHand.handBoneReferences, true);
            Vector3 averageNormal   = (rightHandNormal * -1f + leftHandNormal) / 2f;

            if (debug)
            {
                Vector3 palmPosition = (leftHand.handBoneReferences.wrist.bone.position + leftHand.handBoneReferences.index.proximal.bone.position + leftHand.handBoneReferences.pinky.proximal.bone.position) / 3f;
                Debug.DrawRay(palmPosition, averageNormal, Color.magenta, 1f);

                palmPosition = (rightHand.handBoneReferences.wrist.bone.position + rightHand.handBoneReferences.index.proximal.bone.position + rightHand.handBoneReferences.pinky.proximal.bone.position) / 3f;
                Debug.DrawRay(palmPosition, averageNormal * -1f, Color.magenta, 1f);
            }

            RotateHandToNewPalmNormal(leftHand, true, averageNormal);
            RotateHandToNewPalmNormal(rightHand, false, averageNormal * -1f);
        }