旋转 4x4 矩阵会导致随时间推移而缩放

Rotating a 4x4 Matrix Causes Scaling Over Time

本文关键字:时间 缩放 4x4 旋转      更新时间:2023-10-16

我正在使用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 是否有规范化矩阵的函数,还是我必须自己编写一个?

如果是增量、累积的精度损失:而不是就地更新立方体,而是保留原始未旋转的立方体并跟踪总旋转角度。然后在每一步中,从原始未旋转的立方体创建一个立方体,由总累积旋转角度转换。这样,您的立方体就不会遇到累积舍入问题。

编辑:回应与迈尔斯的讨论,一个更合适的答案:

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

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