How to Lerp a rotation the shortest path

混江龙づ霸主 提交于 2021-01-29 08:22:59

问题


I have a tank, which is made of a base and turret on top, both separate but under a parent object. To shoot, the turret will rotate to the shooting direction, then lerp back towards the tanks base rotation. I want to rotate the turret in the shortest possible direction. So if the base is at 0 degrees and the turret is at 270, I change the 270 to -90 and it will lerp from -90 to 0, however if the base is at 180 and the turret is at 270, it needs to lerp from 270 to 180, not from -90.

This is my current code.

    void StackFunction()
    {
        float turretRotation;
        float bodyRotation; 

        turretRotation = this.transform.eulerAngles.y;
        bodyRotation = playerBody.transform.eulerAngles.y; 

        if (turretRotation > 180)
        {
            turretRotation -= 360; 
        }

        float targetRotation = Mathf.Lerp(turretRotation, bodyRotation, lerpRate);

        this.gameObject.transform.eulerAngles = new Vector3(this.gameObject.transform.eulerAngles.x, targetRotation, this.gameObject.transform.eulerAngles.z);
    }

This is my current code. It works fine when the body is facing 0, however it all inverts when the body swaps to 180.


回答1:


You can interpolate rotations with Quaternion.Lerp or even better Quaternion.Slerp.

Quaternion from = this.transform.rotation;
Quaternion to = playerBody.transform.rotation;

void Update()
{
    transform.rotation = Quaternion.Slerp(from, to, lerpRate);
}


来源:https://stackoverflow.com/questions/57645066/how-to-lerp-a-rotation-the-shortest-path

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!