如何限制Quaternion.RotateTowards()只做顺时针旋转?

问题描述 投票:0回答:1

我做了一个速度表脚本,用于在速度表中轮流转动指针。 The Speedometer

public class Speedometer : MonoBehaviour
{
    public float zeroRate = 3f;
    [SerializeField] PlayerController vehicle;
    void Update()
    {
        if (vehicle.IsOnGround())
        {
            float zRot = ((vehicle.speed * 2.237f) / vehicle.maxSpeed) * 180;
            transform.rotation = Quaternion.Euler(0, 0, -zRot);
        }
        else
        {
            transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.identity, zeroRate * Time.deltaTime);
        }
    }
}

我面临的问题是,针有时会做一个完整的360旋转的方向。Quanternion.identity. 我可以用一个if条件来检查是否超过180,减去差额的两倍,但这个条件会在每一个 Update() 调用,而且只会用一个仅使用一次的if条件来混乱代码。有没有一个函数可以限制顺时针反时针方向的旋转?

c# unity3d
1个回答
1
投票

另外,你也可以做一些类似于存储最后一次的 zRot 值,并随着时间的推移降低它,去

private float zRot;

void Update()
{
    if (vehicle.IsOnGround())
    {
        zRot = ((vehicle.speed * 2.237f) / vehicle.maxSpeed) * 180;
        transform.rotation = Quaternion.Euler(0, 0, -zRot);
    }
    else
    {
        if(zRot > 0)
        {
            zRot -= zeroRate * Time.deltaTime; 
            // clamp to 0
            zRot = Mathf.Max(0, zRot);
            transform.rotation = Quaternion.Euler(0, 0, -zRot);
        }
    }
}

只是现在 zeroRate 将在 °/second 而不是 radians/second 在你的版本中。

© www.soinside.com 2019 - 2024. All rights reserved.