旋转4x4矩阵会导致时间缩放

时间:2012-06-29 21:14:02

标签: c++ opengl matrix rotation scenegraph

我正在使用glm::rotate为场景中的多维数据集旋转变换矩阵。

每帧调用

"cube->t = glm::rotate(cube->t, stepTime * 50.f, glm::vec3(0.f, 1.f, 0.f));"一次,其中cube->t是相关矩阵。

奇怪的是,在20分钟的过程中(如果我按stepTime * 5000.f而不是stepTime * 50.f旋转,则为两分钟),立方体在X和Z轴上显着缩放,其中缩放在这两个轴上始终是相同的(立方体的高度永远不会改变,但宽度和深度的变化完全相同)。在5000.f的情况下,变小,正常50.f100.f变大。

我认为这可能是一个舍入错误的问题,但除此之外我不知道是什么原因造成的。这是舍入错误吗?我可以通过定期规范化矩阵来解决它吗? glm是否具有规范化矩阵的功能,还是我必须自己编写一个?

2 个答案:

答案 0 :(得分:7)

如果是增量,累积,精度损失:不是就地更新立方体,而是保持原始的未旋转立方体并跟踪总旋转角度。然后在每个步骤中,从原始未旋转的立方体创建一个立方体,通过总累积旋转角度进行变换。通过这种方式,您的多维数据集不会受到累积舍入问题的影响。

编辑:回应与Miles的讨论,更合适的答案:

如果你可以分离变换矩阵的旋转和平移分量,问题主要是引入剪切或缩放的旋转累积,你可以通过从旋转分量中提取角度并重新创建具有该角度但单位长度的旋转矩阵。

答案 1 :(得分:0)

是的,这是一个舍入错误。一个合理的解决方案是将方向存储为单个数字,并在每个框架中从头开始构建矩阵。