コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
 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);
 }
コード例 #3
0
        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);
                    }
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
            //}
        }
コード例 #7
0
        public void Setup()
        {
            if (!Hand)
            {
                Hand = GetComponent <HVRPosableHand>();
            }

            if (OpenPose)
            {
                OpenPoseData = OpenPose.GetPose(Hand.IsLeft);
            }

            if (ClosedPose)
            {
                ClosedPoseData = ClosedPose.GetPose(Hand.IsLeft);
            }

            Validate();

            SetupCollision();
        }
コード例 #8
0
        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();
        }
コード例 #9
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);
        }