Quaternion Lerp的LookRotation效果不佳

时间:2018-10-18 14:09:49

标签: c# unity3d

我正在尝试平滑地翻转第一人称角色,同时能够使用鼠标外观在y轴上旋转播放器。问题是lerp不能以确切的结果结束。我希望旋转的结​​尾结果精确到(transform.up == TargetUpDirection())

void FixOrientation() {
    if(transform.up != TargetUpDirection()) //Vector3(0, -1, 0)
    {
        transform.rotation = 
            Quaternion.Lerp(transform.rotation,
                            Quaternion.LookRotation(transform.forward,
                            TargetUpDirection(), 0.1f);
    }
}

如果我在翻转时使用鼠标外观,transform.up.y总是小于1,例如0.99881231,而我需要继续使用鼠标外观直到它校正自身并且我不喜欢它。

原因可能是当我使用鼠标外观时,向前的字符被修改了,这导致了这种情况,但是我不知道如何实现解决方案,因为四元数使我感到困惑。

1 个答案:

答案 0 :(得分:3)

这是因为按照书面规定,Lerp总是使您旋转剩余方式的10%。这意味着,当您接近目标旋转时,旋转量将减少。最终,它将降低到舍入误差使您在实际到达目的地之前旋转0度的程度。

在大多数情况下,您不想使用Lerp的恒定值来调用t

这是另一种选择。首先,选择最大转速:

float smooth = 5f;

然后,使用Quaternion.RotateTowards

Quaternion targetRotation = Quaternion.LookRotation(transform.forward, TargetUpDirection());
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation , smooth * Time.deltaTime);

此答案基于this post,来自Unity论坛。