Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 可能有问题的规范化函数_Directx - Fatal编程技术网

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
    执行第二个函数的功能:执行除法


这在很大程度上取决于输入,即特定用例中的具体错误源以及优化设置。和往常一样,关于这一点的开创性文章是,您应该回顾关于这一点的许多非常有用的浮点文章

请注意,长度应始终为正值,并且避免使用浮点进行equals测试通常会更加健壮:

   float length = Length();
   if (length > 0)
   {
   ...
   }
在中,我提供了两种形式的规范化,以便数学库的用户可以根据具体情况选择权衡:

  • xmvector3normalizest
    执行第一个函数的功能:执行倒数运算,然后进行乘法运算

  • XMVector3Normalize
    执行第二个函数的功能:执行除法


干杯,是的,这正是我所怀疑的浮点运算。分割每个单独的成员确实提高了精度,但仍然存在边缘情况。但就我的目的而言,我可以接受它。虽然我会使用长度测试作为是,但它更准确地表示。在浮点中测试0.0f确实充满了危险。干杯,是的,这就是我对浮点的怀疑。分割每个单独的成员确实提高了精度,但仍然存在边缘情况。但就我的目的而言,我可以接受它。虽然我会使用长度测试作为是,但它更准确地表示。在float中测试0.0f确实充满了危险。请注意,初始代码不是我自己做的。我只是想确认我对正在发生的事情的解释是正确的。请注意,最初的代码不是我自己做的。我只是想确认我对正在发生的事情的解释是正确的。