directx局部空间坐标浮动精度

时间:2015-04-04 11:23:43

标签: graphics directx

我对局部空间坐标系有点困惑。假设我在本地空间中有一个复杂的对象。我知道当我想把它放在世界空间时我必须将它与Scale,Rotate,Translate矩阵相乘。但问题是局部坐标只在-1.0f到1.0f之间,当我想要顶点像(1 / 500,1 / 100,1 / 100)的东西不起作用时,由于浮动,一切都会变为0准确性问题。 我现在唯一的解决方案就是将它们分成许多局部空间系统和ProjectView,将它们分别放在一起。这似乎不是解决问题的正确方法。我已经检查了很多书,但没有人提到这个问题。我真的想知道如何解决它。

1 个答案:

答案 0 :(得分:0)

  

当我想要顶点像(1 / 500,1 / 100,1 / 100)时,事情将无法正常工作

是什么让你这么想?浮动精度问题并不意味着如果无法准确表示,某些东西会强制为0。它只是意味着,它将强制到最接近预期数字的浮点数。

与写下相同,例如,最多6个有效十进制数字的3/9:0.33334 - 它没有强制为0。浮点数也是如此。< / p>

现在您可能熟悉科学记数法:x·10^y - 这实际上是十进制浮点数,尾数x和指数y,它基本上指定了数量级。在二进制浮点数中,它变为x·2^y。在任何一种情况下,有效数字都在尾数中。典型的浮点数(在OpenGL中)的尾数为23位,可以归结为22个有效二进制数字(大约7个十进制数字)。

  

我真的想知道如何解决它。

浮点数的真正问题在于,如果必须在大范围的数量级上混合和合并数字。只要数字具有相似的数量级,一切都只发生在尾数上。并且最后一次改变到[-1,1]范围不会伤害你;这可以通过&#34;规范化&#34;来实现。浮点值,然后只需删除指数。


推荐阅读:http://floating-point-gui.de/


更新

还有一件事:如果您使用C语言编写1/500,那么您正在执行整数除法,这当然会向下舍入到0.如果您希望这是浮点运算,您必须编写浮点字面值或强制转换为浮点数,即

1./500.

(float)1/(float)500

请注意,将其中一个操作数强制转换为使其成为浮点除法