我正在尝试平滑地翻转第一人称角色,同时能够使用鼠标外观在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,而我需要继续使用鼠标外观直到它校正自身并且我不喜欢它。
原因可能是当我使用鼠标外观时,向前的字符被修改了,这导致了这种情况,但是我不知道如何实现解决方案,因为四元数使我感到困惑。
答案 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论坛。