首页 > 解决方案 > 为什么我从 Mathf.Acos 得到 NaN?

问题描述

我在 C# 和统一游戏引擎中编码物理。我偶尔会从这个 Acos 函数中得到一个 NaN 值,我完全被难住了。正如您在调试屏幕截图中看到的那样,我测试了这些值并且它们工作正常,但是当使用该变量时它返回 NaN。请帮忙!

float a = Vector3.Dot(waterlineVec.normalized, transform.InverseTransformDirection(velocityVector.normalized));
a = Mathf.Clamp(-1, a, 1);
alpha = Mathf.Acos(a); //alpha in radians

在此处输入图像描述

标签: c#unity3d

解决方案


我也遇到过这个问题,代码几乎相同。就我而言,我使用Mathf.Clamp01(a)的是 ,相当于Mathf.Clamp(a, 0, 1). 我真的无法解释为什么,但似乎可以通过将此函数调用替换为:

if(a > 1.0f)
    a = 1.0f;
if(a < 0.0f)
    a = 0.0f;

我曾认为这可能是因为Mathf.Clamp01在进行比较之前将浮点数转换为双精度数(如通过反编译 UnityEngine 库所见),但即使我自己在代码中执行此操作,这也不会重现此问题 - 所以我在关于原因有点损失 - 但这确实解决了它。


推荐阅读