Ejemplo n.º 1
0
        public void UpdateBodyMovements()
        {
            if (torso.userNeckTarget)
            {
                if (enableTorso)
                {
                    torso.CalculateHorizontal(headTarget);
                }

                if (enableLegs)
                {
                    torso.CalculateVertical(headTarget);
                }

                leftArm.Calculate(leftHandTarget);
                rightArm.Calculate(rightHandTarget);

                CalculateHeadOrientation(torso.neck, headTarget);
            }
            else
            {
                if (bendAngle <= 0 && !crouching)
                {
                    leftArm.Calculate(leftHandTarget);
                    rightArm.Calculate(rightHandTarget);
                }

                if (enableTorso && !crouching)
                {
                    bendAngle = torso.AutoHorizontal(rightHandOTarget, rightHandTarget, rightArm, leftHandOTarget, leftHandTarget, leftArm, headTarget);
                }

                if (enableLegs && bendAngle >= maxHipAngle)
                {
                    crouching = torso.AutoVertical(rightHandOTarget, rightHandTarget, rightArm, leftHandOTarget, leftHandTarget, leftArm, headTarget);
                }
            }

            if (enableLegs)
            {
                rightLeg.Calculate(rightFootTarget.transform);
                leftLeg.Calculate(leftFootTarget.transform);
            }
        }
Ejemplo n.º 2
0
        public float AutoHorizontal(Transform rightHandOTarget, Transform rightHandTarget, ArmMovements rightArm, Transform leftHandOTarget, Transform leftHandTarget, ArmMovements leftArm, Transform neckTarget)
        {
            float   bendAngle     = 0;
            Vector3 torsoTarget   = Vector3.zero;
            Vector3 dShoulderNeck = (leftArm.upperArm.position - rightArm.upperArm.position) / 2;

            Vector3 leftToTarget  = leftHandOTarget.position - leftArm.upperArmStartPosition;
            Vector3 rightToTarget = rightHandOTarget.position - rightArm.upperArmStartPosition;
            float   leftOver      = leftToTarget.magnitude - leftArm.length;
            float   rightOver     = rightToTarget.magnitude - rightArm.length;

            if (leftOver > 0)
            {
                if (rightOver > 0)
                {
                    Vector3 torsoTargetR = rightHandOTarget.position + dShoulderNeck;
                    Vector3 torsoTargetL = leftHandOTarget.position - dShoulderNeck;
                    float   bendAngleR   = BendAngle(torsoTargetR, rightArm);
                    float   bendAngleL   = BendAngle(torsoTargetL, leftArm);

                    if (bendAngleR > bendAngleL)
                    {
                        torsoTarget = torsoTargetR;
                    }
                    else
                    {
                        torsoTarget = torsoTargetL;
                    }
                }
                else
                {
                    torsoTarget = leftHandOTarget.position - dShoulderNeck;
                }
            }
            else if (rightOver > 0)
            {
                torsoTarget = rightHandOTarget.position + dShoulderNeck;
            }

            if (rightOver > 0 || leftOver > 0)
            {
                bendAngle      = BendAngle(torsoTarget, rightArm); // arm should be left or right
                spine.rotation = spineStartRotation * Quaternion.AngleAxis(bendAngle, spineAxis);
            }
            else
            {
                spine.rotation = spineStartRotation;
            }

            rightArm.Calculate(rightHandTarget);
            leftArm.Calculate(leftHandTarget);

            return(bendAngle);
        }
Ejemplo n.º 3
0
        public bool AutoVertical(Transform rightHandOTarget, Transform rightHandTarget, ArmMovements rightArm, Transform leftHandOTarget, Transform leftHandTarget, ArmMovements leftArm, Transform neckTarget)
        {
            Vector3 neckDelta = Vector3.zero;

            Vector3 leftToTarget  = leftHandOTarget.position - leftArm.upperArmStartPosition;
            Vector3 rightToTarget = rightHandOTarget.position - rightArm.upperArmStartPosition;
            float   leftOver      = leftToTarget.magnitude - leftArm.length;
            float   rightOver     = rightToTarget.magnitude - rightArm.length;

            if (leftOver > 0)
            {
                if (rightOver > leftOver)
                {
                    neckDelta = rightToTarget.normalized * rightOver;
                }
                else
                {
                    neckDelta = leftToTarget.normalized * leftOver;
                }
            }
            else if (rightOver > 0)
            {
                neckDelta = rightToTarget.normalized * rightOver;
            }

            neckTarget.position = neckStartPosition + new Vector3(0, neckDelta.y, 0);

            float dY = neckTarget.transform.position.y - neck.position.y;

            if (hips.position.y + dY < hipStartPosition.y)
            {
                hips.Translate(0, dY, 0, Space.World);
            }
            else if (hips.position.y + dY > hipStartPosition.y)
            {
                hips.position = new Vector3(hips.position.x, hipStartPosition.y, hips.position.z);
            }

            rightArm.Calculate(rightHandTarget);
            leftArm.Calculate(leftHandTarget);

            return(hips.position.y < hipStartPosition.y);
        }