点周围的点旋转,准确性问题

我学习OpenGL ES 2.0。 但是我认为这更像是一个C ++问题,而不是OpenGL。

我被困在下面的旋转问题:众所周知,旋转变换可以应用这些方程(为了简单起见,假设我们旋转(0,0)):

x'=x*cos(theta)-y*sin(theta) y'=x*sin(theta)+y*cos(theta) 

但是,似乎当我多次执行此旋转操作时,发生准确性问题。 我猜这个问题的核心是cos()函数和浮点限制的不确定结果。 因此,我看到我的旋转物体越来越小。 顺便说一下我正在使用C ++。

1.)您怎么看:这个问题是否真的与准确度问题有关?

2.)如果是这样,我该如何处理?

谢谢。

这种types的累积误差通常是通过跟踪原始点(即网格的顶点)及其变换(例如,作为matrix或四元数和比例/平移vector)来处理的。

当您转换对象时,您不会修改原始点。 您只需更新转换数据。 然后,可以根据需要从原件和更新的转换生成一组新的输出点。

这样做可以让你监视转换数据的错误。 如果您保持转换数据在您的数值精度范围内无误的不variables,那么您生成的任何输出点都将在相似范围内保持准确。

你可以用两种方法来做到这一点:

  1. 从更可靠的源数据(如角度variables)中随时从头开始生成转换。

  2. 逐步更新转换,并在进行时进行错误更正:

一个常见的例子是使用旋转matrix。 表示没有缩放/剪切的旋转的matrix必然是正交的 (matrix的每一行或列是单位vector,分别垂直于彼此的行或列)。 所以,你可以通过在做任何改变之后对它进行正交归一化来纠正进入matrix的四舍五入误差。 (也就是取一行,将其缩小到单位长度,取下一行,将其投影减去到目前为止所考虑的行,按比例缩小为单位长度,重复,直到用尽行)