四元数.Slerp由于某些原因无法平稳旋转

时间:2018-11-01 17:26:22

标签: c# unity3d

我正在尝试使用Unity使像对象一样的跷跷板旋转,并且由于某种原因,旋转是瞬时的,而不是逐渐的运动。之前,我已经研究过Slerp和Lerp,但无法与它们一起使用。我想知道是否有人有任何见识,因为我确定我缺少一些愚蠢而简单的xD。 谢谢!这是方法。

private void Rotate(float rotateAmount)
    {
        var oldRotation = transform.rotation;
        transform.Rotate(0, 0, rotateAmount);
        var newRotation = transform.rotation;
 
        for (float t = 0; t <= 1.0; t += Time.deltaTime)
        {
            transform.rotation = Quaternion.Slerp(oldRotation, newRotation, t);
        }
        transform.rotation = newRotation;
    }
}

1 个答案:

答案 0 :(得分:6)

for循环中完成的所有旋转都在一个帧下进行。您看不到它们在一帧之内发生变化。使Rotate函数成为协程函数,然后在每个循环中使用yield return null等待一帧,您应该会看到随着时间的变化。

private IEnumerator Rotate(float rotateAmount)
{
    var oldRotation = transform.rotation;
    transform.Rotate(0, 0, rotateAmount);
    var newRotation = transform.rotation;

    for (float t = 0; t <= 1.0; t += Time.deltaTime)
    {
        transform.rotation = Quaternion.Slerp(oldRotation, newRotation, t);
        yield return null;
    }
    transform.rotation = newRotation;
}

由于它是协程函数,因此您可以启动它而不是直接调用它:

StartCoroutine(Rotate(90f));

我注意到您使用transform.Rotate(0, 0, rotateAmount)来获取目标角度。您不需要这样做。如果需要将对象从当前角度旋转到另一个角度,请获取当前角度,然后将其添加到目标角度,然后使用Vector3.Lerp进行旋转。

请参阅this帖子中的“随着时间的推移角度旋转” 部分。