Ejemplo n.º 1
0
        private void AddFingerCapsules(HVRPosableFinger finger)
        {
            if (finger == null || finger.Bones == null)
            {
                return;
            }

            Undo.SetCurrentGroupName("AddFingerCapsules");

            for (var i = 0; i < finger.Bones.Count; i++)
            {
                var bone = finger.Bones[i];
                var go   = GameObject.Find("coll_" + bone.Transform.name);
                if (go == null || go.transform.parent != bone.Transform)
                {
                    go = new GameObject("coll_" + bone.Transform.name);
                }
                go.transform.parent        = bone.Transform;
                go.transform.localPosition = Vector3.zero;
                go.transform.localRotation = Quaternion.identity;
                go.transform.localScale    = Vector3.one;
                Undo.RegisterCreatedObjectUndo(go, "AddGO");
                var capsule = go.GetComponent <CapsuleCollider>();
                if (!capsule)
                {
                    capsule = go.AddComponent <CapsuleCollider>();
                }
                Transform next;
                if (i < finger.Bones.Count - 1)
                {
                    next = finger.Bones[i + 1].Transform;
                }
                else
                {
                    next = finger.Tip;
                }

                var jointDelta = next.position - bone.Transform.position;
                var length     = jointDelta.magnitude;
                if (CapsuleAddRadius && i == finger.Bones.Count - 1)
                {
                    length -= CapsuleRadius;
                }
                go.transform.position += jointDelta.normalized * (length * 0.5f);
                capsule.height         = length;
                if (CapsuleAddRadius)
                {
                    capsule.height += CapsuleRadius * 2f;
                }

                capsule.radius    = CapsuleRadius;
                capsule.direction = (int)CapsuleDirection;
            }

            Undo.CollapseUndoOperations(Undo.GetCurrentGroup());
        }
Ejemplo n.º 2
0
        private void FindBonesForFinger(Transform bone, Transform tip, HVRPosableFinger finger)
        {
            finger.Bones.Add(new HVRPosableBone()
            {
                Transform = bone.transform
            });

            if (tip.parent == bone)
            {
                return;
            }

            if (bone.childCount > 0)
            {
                FindBonesForFinger(bone.GetChild(0), tip, finger);
            }
        }
Ejemplo n.º 3
0
        public void FingerSetup()
        {
            _fingers = null;

            if (ThumbRoot)
            {
                Thumb      = new HVRPosableFinger();
                Thumb.Root = ThumbRoot;
                Thumb.Tip  = ThumbTip;
                FindBonesForFinger(ThumbRoot, ThumbTip, Thumb);
            }

            if (IndexRoot)
            {
                Index      = new HVRPosableFinger();
                Index.Root = IndexRoot;
                Index.Tip  = IndexTip;
                FindBonesForFinger(IndexRoot, IndexTip, Index);
            }

            if (MiddleRoot)
            {
                Middle      = new HVRPosableFinger();
                Middle.Root = MiddleRoot;
                Middle.Tip  = MiddleTip;
                FindBonesForFinger(MiddleRoot, MiddleTip, Middle);
            }

            if (RingRoot)
            {
                Ring      = new HVRPosableFinger();
                Ring.Root = RingRoot;
                Ring.Tip  = RingTip;
                FindBonesForFinger(RingRoot, RingTip, Ring);
            }

            if (PinkyRoot)
            {
                Pinky      = new HVRPosableFinger();
                Pinky.Root = PinkyRoot;
                Pinky.Tip  = PinkyTip;
                FindBonesForFinger(PinkyRoot, PinkyTip, Pinky);
            }

            EditorUtility.SetDirty(this);
        }
Ejemplo n.º 4
0
        private void PoseFinger(HVRPosableFinger finger, HVRPosableFingerData data)
        {
            if (finger == null || data == null)
            {
                return;
            }

            if (finger.Bones == null || data.Bones == null)
            {
                return;
            }

            for (int i = 0; i < finger.Bones.Count; i++)
            {
                var bone = finger.Bones[i];
                if (data.Bones.Count - 1 >= i)
                {
                    var boneData = data.Bones[i];
                    bone.Transform.localPosition = boneData.Position;
                    bone.Transform.localRotation = boneData.Rotation;
                }
            }
        }
Ejemplo n.º 5
0
        private HVRPosableFingerData MirrorFinger(HVRPosableFinger finger, HVRJointMirrorSetting mirrorOverride, List <HVRJointMirrorSetting> settings)
        {
            var fingerData = new HVRPosableFingerData();

            for (var i = 0; i < finger.Bones.Count; i++)
            {
                var bone     = finger.Bones[i];
                var boneData = new HVRPosableBoneData();



                HVRJointMirrorSetting mirror = null;


                if (settings != null && i < settings.Count)
                {
                    mirror = settings[i];
                }
                else if (mirrorOverride != null)
                {
                    mirror = mirrorOverride;
                }

                if (mirror != null)
                {
                    var euler = bone.Transform.localRotation.eulerAngles;

                    var xAngle = euler.x;
                    var yAngle = euler.y;
                    var zAngle = euler.z;

                    MirrorRotation(mirror.XRotation, ref xAngle);
                    MirrorRotation(mirror.YRotation, ref yAngle);
                    MirrorRotation(mirror.ZRotation, ref zAngle);

                    boneData.Position = bone.Transform.localPosition;
                    boneData.Rotation = Quaternion.Euler(xAngle, yAngle, zAngle);

                    if (mirror.XPosition == FingerMirrorPosition.Opposite)
                    {
                        boneData.Position.x *= -1f;
                    }

                    if (mirror.YPosition == FingerMirrorPosition.Opposite)
                    {
                        boneData.Position.y *= -1f;
                    }

                    if (mirror.ZPosition == FingerMirrorPosition.Opposite)
                    {
                        boneData.Position.z *= -1f;
                    }
                }
                else
                {
                    boneData.Position = bone.Transform.localPosition * -1;
                    boneData.Rotation = bone.Transform.localRotation;
                }

                fingerData.Bones.Add(boneData);
            }

            return(fingerData);
        }