Mathf.Atan2返回错误的结果

Sta*_* BZ 2 c# trigonometry unity-game-engine

有时当我移动鼠标(围绕角色旋转相机)时,我的角色会旋转.但我没有鼠标任何字符旋转.这是我的旋转代码,仅依赖于键盘输入(我从标准统一样本中获取此代码):

private void ConvertMoveInput()
{
    Vector3 localMove = transform.InverseTransformDirection(_moveInput);
    _turnAmount = Mathf.Atan2(localMove.x, localMove.z);
    _forwardAmount = localMove.z;
}
Run Code Online (Sandbox Code Playgroud)

我发现有时当我移动鼠标Mathf.Atan2时返回数字PI,即使两个参数仍然等于零.这是怎么回事?

断点

我的演示项目在这里.

Joe*_*lla 5

请记住,atan2(x, z)返回z轴和向量(x,z)之间的角度:

显示向量(x,z),atan2(x,z)和atan2(z,x)的图

但是atan2(0, 0),你试图找到一个点与z轴或x轴之间的角度,这是没有意义的:

在此输入图像描述

即使atan2(0, 0)是没有意义的,大多数编程语言的数学库有atan2(x, y)返回值,而不是如果一个错误代码xy有效数字,在特殊情况下atan2(0, 0),即返回值是圆周率.C++标准库中的实现就是atan2()这样做的,我认为很多语言,包括Unity的C#实现,都是如此.

这意味着您需要检查特殊情况,其中xz都是0.类似于:

if ((localMove.x != 0) && (localMove.z != 0)) {
  _turnAmount = Mathf.Atan2(localMove.x, localMove.z);
}
else {
  _turnAmount = 0;
}
Run Code Online (Sandbox Code Playgroud)