- Home /
Comparing lerping quaternion
2d top down game. I want my transform to first rotate and face the target position and then move towards it. I got the rotation towards the target position done. It works great. But i need a way to set a bool when the rotation is finished, or finished enough. I tried comparing the quaternions or using quaternion.angle to see if i got a good result but it never arrives. How can i make it so that the bool sets to false when the rotation is 'good enough'?
Ps. i dont want to set a duration for the lerp, i want it to move at a constant speed so that the fewer the angles to rotate, the shorter time it takes.
if (Input.GetMouseButtonDown (0)) {
target = Camera.main.ScreenToWorldPoint (Input.mousePosition);
rotateToTarget = true;
}
if (rotateToTarget == true && target != null) {
targetRotation = Quaternion.LookRotation (transform.position - target, Vector3.forward);
targetRotation.x = 0.0f;
targetRotation.y = 0.0f;
player.transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);
print (player.transform.eulerAngles + " --> " + targetRotation.eulerAngles);
if (player.transform.rotation == targetRotation) {
rotateToTarget = false;
travelToTarget = true;
print ("rotation finished");
}
}
Answer by Owen-Reynolds · Feb 08, 2014 at 07:46 PM
if(Quaterion.Angle(player.rotation, targetRotation)<1)
works fine for me. Of course, it only checks facing, not "spin" (which is rarely an issue.) I also usually add player.rotation=targetRotation;
at the end, for an exact match.
If you want constant speed, replace Lerp with RotateTowards.
== is always a problem, and Lerp will mostly stop at 0.000001 away. EulerAngles have the non-1-to-1 problem: Bruce is at 179.9, but Sally is rotating down from -170, so seems far away (and even weirder stuff, where -180,-180 is the same as 0,0.)
How would you use RotateTowards? I only want rotation on z axis.
See the scripting docs. The main diff between RotTowards and (s)Lerp is that Lerp takes a unit-less percent/fame, while RotTo takes, I think degrees/sec.
The common tricks to rotate on one axis are: 1) make sure the target point is "level" with you. Or, 2) rotate your own angle vars ($$anonymous$$athf.LerpAngle helps with rotating 3 degrees to 356 degrees correctly) and then Quaternion.Euler.