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