private void ApplyFingerCurls(HVRHandPoseData targetHand, HVRHandPoseData defaultHand, HVRHandPoseData sourceHand, HVRHandPoseBlend blend) { for (int i = 0; i < targetHand.Fingers.Length; i++) { var targetFinger = targetHand.Fingers[i]; var defaultFinger = defaultHand.Fingers[i]; var sourceFinger = sourceHand.Fingers[i]; var fingerType = blend.GetFingerType(i); var fingerStart = blend.GetFingerStart(i); var curl = _fingerCurls[i]; var remainder = 1 - fingerStart; curl = fingerStart + curl * remainder; curl = Mathf.Clamp(curl, 0f, 1f); for (int j = 0; j < targetFinger.Bones.Count; j++) { if (fingerType == HVRFingerType.Close) { targetFinger.Bones[j].Position = Vector3.Lerp(sourceFinger.Bones[j].Position, defaultFinger.Bones[j].Position, 1 - curl); targetFinger.Bones[j].Rotation = Quaternion.Lerp(sourceFinger.Bones[j].Rotation, defaultFinger.Bones[j].Rotation, 1 - curl); } } } }
public void PoseFingers(HVRHandPoseData pose) { PoseFinger(Thumb, pose.Thumb); PoseFinger(Index, pose.Index); PoseFinger(Middle, pose.Middle); PoseFinger(Ring, pose.Ring); PoseFinger(Pinky, pose.Pinky); }
private void ApplyBlend(HVRHandPoseData targetHand, HVRHandPoseBlend targetBlend, HVRHandPoseData sourceHand) { //var target = targetBlend.Pose.GetPose(Hand.IsLeft); var lerp = targetBlend.Value * targetBlend.Weight; if (targetBlend.Mask == HVRHandPoseMask.None || targetBlend.Mask.HasFlag(HVRHandPoseMask.Hand)) { targetHand.Position = Vector3.Lerp(targetHand.Position, sourceHand.Position, lerp); targetHand.Rotation = Quaternion.Lerp(targetHand.Rotation, sourceHand.Rotation, lerp); } for (var i = 0; i < targetHand.Fingers.Length; i++) { var targetFinger = targetHand.Fingers[i]; var sourceFinger = sourceHand.Fingers[i]; HVRHandPoseMask mask; if (i == 0) { mask = HVRHandPoseMask.Thumb; } else if (i == 1) { mask = HVRHandPoseMask.Index; } else if (i == 2) { mask = HVRHandPoseMask.Middle; } else if (i == 3) { mask = HVRHandPoseMask.Ring; } else if (i == 4) { mask = HVRHandPoseMask.Pinky; } else { continue; } if (targetBlend.Mask == HVRHandPoseMask.None || targetBlend.Mask.HasFlag(mask)) { for (var j = 0; j < targetFinger.Bones.Count; j++) { var targetBone = targetFinger.Bones[j]; var sourceBone = sourceFinger.Bones[j]; targetBone.Position = Vector3.Lerp(targetBone.Position, sourceBone.Position, lerp); targetBone.Rotation = Quaternion.Lerp(targetBone.Rotation, sourceBone.Rotation, lerp); } } } }
public void Pose(HVRHandPoseData pose, bool poseHand = true) { if (poseHand) { transform.localPosition = pose.Position; transform.localRotation = pose.Rotation; } PoseFinger(Thumb, pose.Thumb); PoseFinger(Index, pose.Index); PoseFinger(Middle, pose.Middle); PoseFinger(Ring, pose.Ring); PoseFinger(Pinky, pose.Pinky); }
public HVRHandPoseData CreateHandPose(Transform transformOverride = null) { var t = transformOverride ?? transform; var data = new HVRHandPoseData { Position = t.localPosition, Rotation = t.localRotation, }; data.Thumb = Thumb?.GetFingerData(); data.Index = Index?.GetFingerData(); data.Middle = Middle?.GetFingerData(); data.Ring = Ring?.GetFingerData(); data.Pinky = Pinky?.GetFingerData(); return(data); }
public void SetCurrentPoser(HVRHandPoser poser, bool poseHand = true) { BlendedSecondarys.Clear(); TargetSecondarys.Clear(); _poseHand = poseHand; if (!PosePosAndRot) { _poseHand = false; } CurrentPoser = poser; if (poser == null) { return; } if (poser.PrimaryPose == null) { return; } BlendedPrimary = poser.PrimaryPose.Pose.GetPose(Hand.IsLeft).DeepCopy(); TargetPrimary = poser.PrimaryPose.Pose.GetPose(Hand.IsLeft).DeepCopy(); CurrentPrimary = poser.PrimaryPose.Pose.GetPose(Hand.IsLeft); for (var i = 0; i < poser.Blends.Count; i++) { var blend = poser.Blends[i]; if (blend.Pose) { BlendedSecondarys.Add(blend.Pose.GetPose(Hand.IsLeft).DeepCopy()); TargetSecondarys.Add(blend.Pose.GetPose(Hand.IsLeft).DeepCopy()); } } //if (poser.PrimaryPose.Type == BlendType.Immediate) //{ // Hand.Pose(poser.PrimaryPose.Pose.GetPose(Hand.Side), _poseHand); //} }
public void Setup() { if (!Hand) { Hand = GetComponent <HVRPosableHand>(); } if (OpenPose) { OpenPoseData = OpenPose.GetPose(Hand.IsLeft); } if (ClosedPose) { ClosedPoseData = ClosedPose.GetPose(Hand.IsLeft); } Validate(); SetupCollision(); }
void Start() { _fingerCurls = new float[5]; if (!PhysicsPoser) { PhysicsPoser = GetComponent <HVRPhysicsPoser>(); } if (!DefaultPoser) { DefaultPoser = GetComponent <HVRHandPoser>(); } if (!Hand) { Hand = GetComponent <HVRPosableHand>(); } DefaultPrimary = DefaultPoser.PrimaryPose.Pose.GetPose(Hand.IsLeft).DeepCopy(); ResetToDefault(); }
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); }