- Home /
The question is answered, right answer was accepted
How would I smooth out a Quaternion?
void DoOrientation()
{
if (go = null)
{
Finish ();
return;
}
v1 = leftFront.Value;
v2 = leftRear.Value;
v3 = rightFront.Value;
v4 = rightRear.Value;
Vector3 upDir;
upDir = (Vector3.Cross (v1, v3) +
Vector3.Cross (v3, v4) +
Vector3.Cross (v4, v2) +
Vector3.Cross (v2, v1)).normalized;
go.transform.rotation = Quaternion.FromToRotation(go.transform.up, upDir) * go.transform.rotation;
}
I feel like I'm almost there but I can't figure out how to use Quaternion.Lerp in this case while I've got Quaternion.FromToRotation actually figuring things out.
The use case is I have 4 feet of a Quadruped defined and I'm using the normal average to orient the body of the Agent / Vehicle / Quadruped... I would like this to be smoother because it's quite jerky as is but I'm fairly burnt out trying to sort out the Vectors and/or Quaternions for this as it really isn't my forte so many someone can shine some fresh light on my problem :s ..
Thanks
Answer by hardmode2236 · Jan 23, 2015 at 07:48 AM
i just recently had to figure out Quaternion.lerp as well, and i hope i'm understanding your code right:
you want the rotation of the "vehicle's" body to match the average direction of its 4 feet?
what you could try is something like this
go.transform.rotation = Quaternion.Lerp(go.transform.rotation, targetRotation.rotation, rotationSpeed);
you would need to set the upDir's averaged Vector3 into a transform i think, because the Quaternion.Lerp function only deals with Quaternions - not Vector3s. and use that as the "targetRotation.rotation"
and as for the rotation speed: 1 is instant rotation i think. so to make it smooth try .1 or so.
Answer by LaneFox · Jan 23, 2015 at 05:01 PM
void DoOrientation()
{
if (go == null)
{
Finish ();
Debug.LogWarning("GameObject Missing.");
return;
}
v1 = leftFront.Value;
v2 = leftRear.Value;
v3 = rightFront.Value;
v4 = rightRear.Value;
Vector3 upDir;
upDir = (Vector3.Cross (v1, v3) +
Vector3.Cross (v3, v4) +
Vector3.Cross (v4, v2) +
Vector3.Cross (v2, v1)).normalized;
// create and define the target rotation using the average direction of the feet
Quaternion targetRotation = Quaternion.FromToRotation(go.transform.up, upDir) * go.transform.rotation;
// apply the lerp from the current rotation toward the target rotation with a speed.
go.transform.rotation = Quaternion.Lerp(go.transform.rotation, targetRotation, speed.Value);
// working // old code, simpler. //
// go.transform.rotation = Quaternion.FromToRotation(go.transform.up, upDir) * go.transform.rotation;
// working //
}
Solved code above.
Had to create a transform as a target which solved the averaging of the direction first, then Lerp between the go rotation and the solved Quaternion.
Thanks for hardmode2236 for pointing this out.