【问题标题】:Rotating a 4x4 Matrix Causes Scaling Over Time旋转 4x4 矩阵会导致随时间缩放
【发布时间】:2012-07-01 09:56:03
【问题描述】:

我正在使用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 有没有标准化矩阵的功能,还是我必须自己写一个?

【问题讨论】:

  • 您提出了一个有趣的问题,揭示了数学分析和迭代数值结果之间的实际差异。我怀疑你对矩阵进行归一化是正确的。
  • 听起来像舍入错误,但我还没有接触过 OpenGL 的 yonks - 标准化矩阵听起来像是一个想法。您是否尝试过更改旋转参数,看看它是否会因不同的旋转向量而产生不同的影响?
  • 我没有尝试过不同的向量。测试后我会告诉你会发生什么。
  • 是的,当我在 Z 轴上旋转立方体时,它似乎只在 X 和 Y 轴上缩放。所以它的反应是一样的

标签: c++ opengl matrix rotation scenegraph


【解决方案1】:

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

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

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

【讨论】:

  • 我想将矩阵用于视频游戏,其中必须以增量方式存储更改。如何防止我的模型随着时间的推移而扩展?
  • @MilesRufat-Latre。如果它们必须以增量方式存储,则它们必须以增量方式存储。但是,如果您看到累积精度问题,最好(最稳定/合理/稳健)的解决方案是保留原始数据结构和一些表示要应用的累积转换的数据结构。你确定这在你的情况下是不可能的吗?否则,您可以尝试标准化。您是否在应用平移和旋转?
  • 是的,我将在同一个矩阵中同时使用平移和旋转。 (而且我不能以任何方式避免增量存储变换:游戏包含大量 3D 物理模拟,以任何其他方式跟踪变换都会限制功能)
  • 四元数是否与旋转缩放有相同的问题? (我不介意旋转是否不精确,只要结果没有发生缩放)
  • 如果不打算缩放多维数据集,则不必分离这些信息。您需要做的就是在每个旋转步骤之后对矩阵的旋转部分进行正交归一化。 (谷歌用于 Gram Schmidt 正交归一化)
【解决方案2】:

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

【讨论】:

  • 查看我对上述答案的评论。
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2011-04-28
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2010-11-12
相关资源
最近更新 更多