c++ - 旋转 4x4 矩阵会导致随时间缩放

标签 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 有标准化矩阵的函数吗,还是我必须自己写一个?

最佳答案

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

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

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

关于c++ - 旋转 4x4 矩阵会导致随时间缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269050/

相关文章:

c# - 数据表中的计算

python - 从函数创建矩阵

r - 在 R 中将大矩阵转换为二进制评分矩阵?

c++ - Thrust中是否有 boost 计算功能的类比?

c++ - 如何将多参数模板传递给宏?

c++ - OpenGL:一次只能有一个 FBO 工作

c++ - 为什么我的翻译矩阵需要转置?

c++ - 复制或移动 FrameBufferObject

c++ - INET应用层如何发送广播包

c++ - C++ 中的异步函数