- Home /
Choppy rotation of character around y-axis
I have a third-person character that I turn around by rotation around y-axis, which works but the rotation is choppy. I have looked into Quaternion.Slerp but can't get it to work. Current working code with unsmooth rotation of character/player:
Quaternion turnAngle = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);
playerTransform.Rotate(0, turnAngle.eulerAngles.y, 0, Space.World);
What I have been experimenting with using Slerp:
Quaternion turnAngle = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);
Quaternion fromRotation = playerTransform.rotation;
Vector3 euler = new Vector3(0, turnAngle.eulerAngles.y, 0);
Quaternion toRotation = Quaternion.Euler(euler);
playerTransform.rotation = Quaternion.Slerp(fromRotation, toRotation, Time.deltaTime * 0.2f);
This doesn't work at all for rotation. Any suggestion to make it work?
Answer by unity_ek98vnTRplGj8Q · Mar 19, 2020 at 04:22 PM
It looks like you are just mixing up absolute orientations and delta rotations. Your "toRotation" in your Quaternion.Slerp should be the orientation that you want, but you are giving it the rotation offset from your current rotation. The difference here, to be clear, is the difference between saying "I want to orient myself to face 30 degrees off from facing north" and "I want to turn 30 degrees to my right regardless of where I am facing right now".
To get your desired orientation, just multiply your current orientation by your delta rotation. Be careful because order matters in quaternion multiplication.
Quaternion turnAngle = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);
Quaternion fromRotation = playerTransform.rotation;
Vector3 euler = new Vector3(0, turnAngle.eulerAngles.y, 0);
Quaternion toRotation = playerTransform.rotation * Quaternion.Euler(euler);
playerTransform.rotation = Quaternion.Slerp(fromRotation, toRotation, Time.deltaTime * 0.2f);