有没有办法从-180到180转为0到360旋转

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

所以直到现在我还没有注意到这一点,但是当通过脚本更改它时,Unity 的旋转从 -180 到 180 。考虑到在检查器中更改时,旋转可以达到无穷大,我觉得这很奇怪,但这可能是由于某种我还不知道的原因。为什么这对我来说是个问题?好吧,我正在尝试将对象从当前旋转旋转回 0,它应该是逆时针旋转。当我旋转高达 180 度时,一切正常,任何高于此的旋转代码都不起作用,基本上我无法使对象旋转超过半圈。我觉得通过更标准和传统的 0 到 360 旋转,我可以更轻松地编写代码。 感谢任何反馈,提前致谢。

编辑:抱歉回复晚了,这是代码:

[ContextMenu("Rotate Chamber")]
public void RotateChamber()
{
    StartCoroutine(RotateOverTime(60, 1f, true));
}

[ContextMenu("Reload Chamber")]
public void Reload()
{
    float currentAngle = -chamber.localEulerAngles.z;
    StartCoroutine(RotateOverTime(currentAngle, 5f, false));
}

private IEnumerator RotateOverTime(float angle, float duration, bool clockWiseRotation)
{
    Quaternion startRotation = chamber.localRotation;
    Quaternion targetRotation = chamber.localRotation * Quaternion.Euler(0, 0, clockWiseRotation ? -angle : angle);

    float elapsedTime = 0f;
    while (elapsedTime < duration)
    {
        chamber.localRotation = Quaternion.Lerp(startRotation, targetRotation, elapsedTime / duration);
        elapsedTime += Time.deltaTime;
        yield return null;
    }

    chamber.localRotation = targetRotation;
}

我不知道它会有多大帮助,因为这不是一些高级代码,而是非常基本的东西,但无论如何还是感谢您的帮助。

unity-game-engine
1个回答
0
投票

您正在寻找的方法是 Transform.RotateAround

您采用的方法的问题在于四元数的工作方式 - 它代表一个向量可以修改为另一个向量的最短路径。因此,旋转超过 180 度是没有意义的 - 因为旋转 185 度本质上也是向另一个方向旋转 175 度。

您可以做的就是快速调用

RotateAround
,直到获得您感兴趣的角度。因此,将
angle
除以
duration
- 这就是您感兴趣的每秒旋转次数(乘以
Time.deltaTime
)。至于轴 - 我假设你想围绕
Transform.forward
旋转?

private IEnumerator RotateOverTime(float angle, float duration, bool clockWiseRotation)
{
    float speed = angle / duration * (clockWiseRotation ? 1.0f : -1.0f);

    float elapsedTime = 0f;
    while (elapsedTime < duration)
    {
        chamber.RotateAround(chamber.position, chamber.forward, speed * Time.deltaTime;
        elapsedTime += Time.deltaTime;
        yield return null;
    }
}

不确定轴,我假设您旋转左轮手枪室,因此围绕其前向矢量旋转是有意义的。

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