旋转 4x4 矩阵会导致随时间推移而缩放
Rotating a 4x4 Matrix Causes Scaling Over Time
我正在使用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.f
或100.f
,变大。
我认为这可能是舍入误差的问题,但除此之外,我不知道是什么原因造成的。这是舍入误差吗?我可以通过定期规范化矩阵来解决它吗?glm 是否有规范化矩阵的函数,还是我必须自己编写一个?
如果是增量、累积的精度损失:而不是就地更新立方体,而是保留原始未旋转的立方体并跟踪总旋转角度。然后在每一步中,从原始未旋转的立方体创建一个立方体,由总累积旋转角度转换。这样,您的立方体就不会遇到累积舍入问题。
编辑:回应与迈尔斯的讨论,一个更合适的答案:
如果可以分离变换矩阵的旋转和平移分量,并且问题主要在于引入剪切或缩放的旋转累积,则可以通过从旋转分量中提取角度并重新创建具有该角度但单位长度的旋转矩阵来纠正问题。
是的,这是一个舍入错误。一个合理的解决方案是将方向存储为单个数字,并在每一帧中从头开始构建矩阵。
相关文章:
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- QwtPlot具有相等的轴和自动缩放
- 如何在directx/c++中进行平移/缩放操作
- 在Qt中实现无限可缩放的画布
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何在OpenGL(GLFW,很高兴)中进行2D缩放?
- 改变或缩放两个正态分布以具有特定的相关系数
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在OpenGL中正确旋转和缩放对象?
- 仅当类型为 std::complex 时,才进行缩放
- 将 VS Code 用于跨平台可缩放C++项目
- 根据帧速率缩放/缩小数字
- 在 c++ 中缩放浮点值
- 如何防止 DirectX C++程序的拉伸/缩放
- 使用提升几何缓冲区缩放多边形时的冗余折点
- C++,你如何缩放标准::时间::d
- 在cocos2d中设置特定时间的缩放Xcode