Esempio n. 1
0
        public void UpdateAllTargetPositions(Point p)
        {
            IkPositions lhTemp = p.ReturnIK(AvatarIKGoal.LeftHand);

            if (lhTemp.target)
            {
                lhTargetPosition = lhTemp.target.position;
            }

            IkPositions rhTemp = p.ReturnIK(AvatarIKGoal.RightHand);

            if (rhTemp.target)
            {
                rhTargetPosition = rhTemp.target.position;
            }

            IkPositions lfTemp = p.ReturnIK(AvatarIKGoal.LeftFoot);

            if (lfTemp.target)
            {
                lfTargetPosition = lfTemp.target.position;
            }

            IkPositions rfTemp = p.ReturnIK(AvatarIKGoal.RightFoot);

            if (rfTemp.target)
            {
                rfTargetPosition = rfTemp.target.position;
            }
        }
Esempio n. 2
0
        void OnSceneGUI()
        {
            DrawWireCube t = target as DrawWireCube;

            if (t.IkPositionList.Count == 0)
            {
                t.IkPositionList = t.transform.GetComponent <Point>().iks;
            }

            for (int i = 0; i < t.IkPositionList.Count; i++)
            {
                IkPositions currentIK = t.IkPositionList[i];
                if (currentIK.target != null)
                {
                    // Default color, to be overwritten once determined IK part
                    Color targetColor = Color.red;

                    switch (currentIK.IK)
                    {
                    case AvatarIKGoal.LeftHand:
                        targetColor = Color.cyan;
                        break;

                    case AvatarIKGoal.RightHand:
                        targetColor = Color.yellow;
                        break;

                    case AvatarIKGoal.LeftFoot:
                        targetColor = Color.magenta;
                        break;

                    case AvatarIKGoal.RightFoot:
                        targetColor = Color.green;
                        break;

                    default:
                        Debug.Log("Invalid IK component!");
                        break;
                    }

                    Handles.color = targetColor;

                    Handles.CubeHandleCap(0, currentIK.target.position, currentIK.target.rotation, 0.05f, EventType.Repaint);

                    if (currentIK.hint != null)
                    {
                        Handles.CubeHandleCap(0, currentIK.hint.position, currentIK.hint.rotation, 0.05f, EventType.Repaint);
                    }
                }
                else
                {
                    // Assign IKs to editor
                    t.IkPositionList = t.transform.GetComponent <Point>().iks;
                }
            }
        }
Esempio n. 3
0
        void UpdateIK(AvatarIKGoal ik, IkPositions ikInfo, Transform ikHelper, float ikWeight, AvatarIKHint ikHint)
        {
            if (ikInfo != null)
            {
                anim.SetIKPositionWeight(ik, ikWeight);
                anim.SetIKRotationWeight(ik, ikWeight);
                anim.SetIKPosition(ik, ikHelper.position);
                anim.SetIKRotation(ik, ikHelper.rotation);

                if ((ik == AvatarIKGoal.LeftHand) || (ik == AvatarIKGoal.RightHand))
                {
                    Transform shoulder = (ik == AvatarIKGoal.LeftHand) ?
                                         anim.GetBoneTransform(HumanBodyBones.LeftShoulder) :
                                         anim.GetBoneTransform(HumanBodyBones.RightShoulder);

                    // relative offset
                    Vector3 offset = modelTransform.forward + Vector3.up / 2;

                    // [TUNE] Rotate hand to align with should so that the gesture is more natural, can be tuned
                    Vector3 targetRotationDirection = shoulder.transform.position - (ikHelper.transform.position + offset);

                    Quaternion targetRotation = Quaternion.LookRotation(-targetRotationDirection);
                    ikHelper.rotation = targetRotation;
                }
                else
                {
                    ikHelper.rotation = ikInfo.target.transform.rotation;
                }

                if (ikInfo.hint != null)
                {
                    anim.SetIKHintPositionWeight(ikHint, ikWeight);
                    anim.SetIKHintPosition(ikHint, ikInfo.hint.position);
                }
            }
        }
Esempio n. 4
0
        void OnAnimatorIK(int layerIndex)
        {
            if (lhPoint)
            {
                IkPositions lhTemp = lhPoint.ReturnIK(AvatarIKGoal.LeftHand);

                if (lhTemp.target)
                {
                    lhHelper.transform.position = Vector3.Lerp(lhHelper.transform.position, lhTargetPosition, Time.deltaTime * helperSpeed);
                }

                UpdateIK(AvatarIKGoal.LeftHand, lhTemp, lhHelper, lhWeight, AvatarIKHint.LeftElbow);
            }

            if (rhPoint)
            {
                IkPositions rhTemp = rhPoint.ReturnIK(AvatarIKGoal.RightHand);

                if (rhTemp.target)
                {
                    rhHelper.transform.position = Vector3.Lerp(rhHelper.transform.position, rhTargetPosition, Time.deltaTime * helperSpeed);
                }

                UpdateIK(AvatarIKGoal.RightHand, rhTemp, rhHelper, rhWeight, AvatarIKHint.RightElbow);
            }

            if (hips == null)
            {
                hips = anim.GetBoneTransform(HumanBodyBones.Hips);
            }

            if (lfPoint)
            {
                IkPositions lfTemp = lfPoint.ReturnIK(AvatarIKGoal.LeftFoot);

                if (lfTemp.target)
                {
                    Vector3 targetPosition = lfTargetPosition;

                    if (forceFeetHeight)
                    {
                        if (targetPosition.y > hips.transform.position.y)
                        {
                            targetPosition.y = targetPosition.y - 0.2f;
                        }
                    }

                    lfHelper.transform.position = Vector3.Lerp(lfHelper.transform.position, lfTargetPosition, Time.deltaTime * helperSpeed);
                }

                UpdateIK(AvatarIKGoal.LeftFoot, lfTemp, lfHelper, lfWeight, AvatarIKHint.LeftKnee);
            }

            if (rfPoint)
            {
                IkPositions rfTemp = rfPoint.ReturnIK(AvatarIKGoal.RightFoot);

                if (rfTemp.target)
                {
                    Vector3 targetPosition = rfTargetPosition;

                    if (forceFeetHeight)
                    {
                        if (targetPosition.y > hips.transform.position.y)
                        {
                            targetPosition.y = targetPosition.y - 0.2f;
                        }
                    }

                    rfHelper.transform.position = Vector3.Lerp(rfHelper.transform.position, rfTargetPosition, Time.deltaTime * helperSpeed);
                }

                UpdateIK(AvatarIKGoal.RightFoot, rfTemp, rfHelper, rfWeight, AvatarIKHint.RightKnee);
            }
        }