How can I clamp a target rotation within the rotation limits of a character joint?
I have an active ragdoll animation system that I am working on and have been running into an issue when the target rotation is set to an angle that can not be achieved because of the joint limits on the ragdoll.
Bellow is my solution to this issue but it doesn't work. The angles are all correct except about half of the values are of the opposite sign.(-x,y,z, but x,-y,z instead) This is consistent from frame to frame, but the swapped values for xyz are different for every single body part.
targetRotation = target.localRotation; // The target rotation can be replaced with whatever rotation you want to align to
if (isRoot) targetRotation = target.rotation;
else
{
Vector3 rotAxis = Mathf.Clamp(GetRelativeAngles(Vector3.Project(targetRotation.eulerAngles, joint.axis)).magnitude, joint.lowTwistLimit.limit, joint.highTwistLimit.limit) * joint.axis;
Vector3 rotSwing1 = Mathf.Clamp(GetRelativeAngles(Vector3.Project(targetRotation.eulerAngles, joint.swingAxis)).magnitude, -joint.swing1Limit.limit, joint.swing1Limit.limit) * joint.swingAxis;
Vector3 swing2axis = Vector3.Cross( joint.swingAxis,joint.axis);
Vector3 rotSwing2 = Mathf.Clamp(GetRelativeAngles(Vector3.Project(targetRotation.eulerAngles, swing2axis)).magnitude, -joint.swing2Limit.limit, joint.swing2Limit.limit) * swing2axis;
Vector3 clampedRot = rotAxis + rotSwing1 + rotSwing2;
targetRotation = Quaternion.Euler(clampedRot);
}
The GetRelativeAngles() method is exactly what it sounds like and is working properly for other parts of the program.
Vector3 GetRelativeAngles(Vector3 angles)
{
Vector3 relativeAngles = angles;
if (relativeAngles.x > 180f)
relativeAngles.x -= 360f;
if (relativeAngles.y > 180f)
relativeAngles.y -= 360f;
if (relativeAngles.z > 180f)
relativeAngles.z -= 360f;
return relativeAngles;
}
If anybody could give me any insight on what I'm doing wrong it would be greatly appreciated!
Your answer
Follow this Question
Related Questions
Hard coded rotation of child results in weird arc rotation when parent is rotated? 0 Answers
how do i reference two input axis at one time on javascript 0 Answers
Rotate an object respectively to other object's rotation on z-axis 2 Answers
align object with collision normal then look at an object on one axis 0 Answers