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