Directx 可能有问题的规范化函数
我一直在使用一个向量类,它有一个规格化函数Directx 可能有问题的规范化函数,directx,Directx,我一直在使用一个向量类,它有一个规格化函数 float length = Length(); if (!MathUtil.IsZero(length)) { float inv = 1.0f / length; X *= inv; Y *= inv; Z *= inv; } 我发现,在某些情况下,它似乎产生了一个单位向量,而不是一个单位向
float length = Length();
if (!MathUtil.IsZero(length))
{
float inv = 1.0f / length;
X *= inv;
Y *= inv;
Z *= inv;
}
我发现,在某些情况下,它似乎产生了一个单位向量,而不是一个单位向量。知道浮点是某种程度的近似值,在某些情况下,我在点积中使用归一化向量,得到的点值大于1。这和Acos的情况一样糟糕,它会产生NaN
由于点用于摄影机旋转,因此它确实会产生旋转记号
我最后做的是重写代码,如下所示:
float length = a_vector.Length();
if (!MathUtil.IsZero(length))
{
a_vector.X /= length;
a_vector.Y /= length;
a_vector.Z /= length;
}
这似乎将这个问题的严重性降低到几乎为0
目前,除非另有说明,否则这是一种确认偏见。但我的问题是,尽管速度肯定较慢,但这是一种更准确的规范化吗?这在很大程度上取决于输入,即特定用例中的具体错误源是什么,以及优化设置。和往常一样,关于这一点的开创性文章是,您应该回顾关于这一点的许多非常有用的浮点文章 请注意,长度应始终为正值,并且避免使用浮点进行equals测试通常会更加健壮:
float length = Length();
if (length > 0)
{
...
}
在中,我提供了两种形式的规范化,以便数学库的用户可以根据具体情况选择权衡:
执行第一个函数的功能:执行倒数运算,然后进行乘法运算xmvector3normalizest
执行第二个函数的功能:执行除法XMVector3Normalize
float length = Length();
if (length > 0)
{
...
}
在中,我提供了两种形式的规范化,以便数学库的用户可以根据具体情况选择权衡:
执行第一个函数的功能:执行倒数运算,然后进行乘法运算xmvector3normalizest
执行第二个函数的功能:执行除法XMVector3Normalize