c# - 为什么我从 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
解决方案
我也遇到过这个问题,代码几乎相同。就我而言,我使用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 库所见),但即使我自己在代码中执行此操作,这也不会重现此问题 - 所以我在关于原因有点损失 - 但这确实解决了它。
推荐阅读
- sql - 用 SQL 操作矩阵的逻辑步骤
- python - 200GB Sqlite 数据库文件搜索和检索
- c# - 给定长度的数组划分为 N 个部分,指定每个部分的开始和结束索引
- scripting - 在 shell 脚本中验证记录顺序
- git - 我如何处理 Git lfs 问题
- c# - InsertAndGetIdAsync - 无法为标识列插入显式值
- c# - 如何在 .net 核心中运行使用依赖注入的非静态代码
- jenkins - terraform fmt 在 Jenkins 管道中失败
- swift - 为什么 NSImage.Name 存在?
- autosar - AUTOSAR:检测模型中的二维数组