Esempio n. 1
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);
        }
Esempio n. 2
0
        public HVRHandPoseData Mirror(MirrorAxis handMirrorAxis, Transform transformOverride = null)
        {
            var t = transformOverride ?? transform;

            var clone = new HVRHandPoseData();

            clone.Position = t.localPosition;

            Vector3 direction;

            switch (handMirrorAxis)
            {
            case MirrorAxis.X:
                clone.Position.x *= -1f;
                direction         = Vector3.right;
                break;

            case MirrorAxis.Y:
                clone.Position.y *= -1;
                direction         = Vector3.up;
                break;

            case MirrorAxis.Z:
                clone.Position.z *= -1;
                direction         = Vector3.forward;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(handMirrorAxis), handMirrorAxis, null);
            }

            Vector3 forward;
            Vector3 up;

            if (t.parent != null)
            {
                forward = t.parent.InverseTransformDirection(t.forward);
                up      = t.parent.InverseTransformDirection(t.up);
            }
            else
            {
                forward = t.forward;
                up      = t.up;
            }

            var mirror   = Vector3.Reflect(forward, direction);
            var upMirror = Vector3.Reflect(up, direction);

            clone.Rotation = Quaternion.LookRotation(mirror, upMirror);

            HVRJointMirrorSetting thumbOverride = null;
            HVRJointMirrorSetting indexMirror   = null;
            HVRJointMirrorSetting middleMirror  = null;
            HVRJointMirrorSetting ringMirror    = null;
            HVRJointMirrorSetting pinkyMirror   = null;

            if (MirrorSettings)
            {
                thumbOverride = MirrorSettings.UseThumbSetting ? MirrorSettings.ThumbSetting : MirrorSettings.AllSetting;
                indexMirror   = MirrorSettings.UseIndexSetting ? MirrorSettings.IndexSetting : MirrorSettings.AllSetting;
                middleMirror  = MirrorSettings.UseMiddleSetting ? MirrorSettings.MiddleSetting : MirrorSettings.AllSetting;
                ringMirror    = MirrorSettings.UseRingSetting ? MirrorSettings.RingSetting : MirrorSettings.AllSetting;
                pinkyMirror   = MirrorSettings.UsePinkySetting ? MirrorSettings.PinkySetting : MirrorSettings.AllSetting;
            }


            if (Thumb != null)
            {
                clone.Thumb = MirrorFinger(Thumb, thumbOverride, MirrorSettings?.ThumbSettings);
            }

            if (Index != null)
            {
                clone.Index = MirrorFinger(Index, indexMirror, MirrorSettings?.IndexSettings);
            }

            if (Middle != null)
            {
                clone.Middle = MirrorFinger(Middle, middleMirror, MirrorSettings?.MiddleSettings);
            }

            if (Ring != null)
            {
                clone.Ring = MirrorFinger(Ring, ringMirror, MirrorSettings?.RingSettings);
            }

            if (Pinky != null)
            {
                clone.Pinky = MirrorFinger(Pinky, pinkyMirror, MirrorSettings?.PinkySettings);
            }

            return(clone);
        }