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); }
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); }