【问题标题】:Compact representation of OpenGL modelview matrix 4x4OpenGL 模型视图矩阵 4x4 的紧凑表示
【发布时间】:2011-02-03 23:41:40
【问题描述】:

仅存储 OGL 模型视图 (4x4) 矩阵的旋转部分的最用户友好的方式是什么?

例如;在关卡编辑器中设置对象的旋转,很容易使用 XYZ 欧拉角。然而,这似乎是一个与矩阵一起使用的非常棘手的系统。

我需要能够从这个新表示中获取并设置旋转。

(另一种方法是存储旋转部分(4*3 个数字),但用户很难操作这些)

我在这里找到了一些代码http://www.google.com/codesearch/p?hl=en#HQY9Wd_snmY/mesh/matrix3.h&q=matrix3&sa=N&cd=1&ct=rc,它允许我设置和获取角度旋转(3 个浮点数)。这是理想的。

【问题讨论】:

  • 旋转部分是3x3,不是4x3

标签: c opengl 3d matrix rotation


【解决方案1】:

尽管经常使用它们,但我忽略了欧拉角的使用。它们是有问题的,因为它们只保留对象的指向方向,而不是该方向的双切线。更重要的是:他们很容易出现 gibal lock http://en.wikipedia.org/wiki/Gimbal_lock

四元数是存储旋转的一种更好的方法。通俗地说,四元数由旋转轴和围绕该轴的旋转角度组成。因此,它是 4 个标量 a、b、c、d 的元组。那么四元数就是 Q = a + i*b + j*c + k*d, |Q| = 1,具有 i,j,k 的特殊性质,即 i² = j² = k² = i·j·k = -1 且 i·j = k,j·k = i,k·i = j,这意味着 j ·i = -k, k·j = -i, i·k = -j

因此,四元数是复数的扩展。如果你回想复数论,你会记得两个复数 a =/= b 与 |a| 的乘积。 = |b| = 1 是复平面中的旋转。因此很容易假设 3D 中的旋转可以通过将复数扩展到复超平面来描述。这就是四元数。

详情请看这篇文章。 http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

【讨论】:

  • 呸,你领先我一分钟。删除我的答案:D
  • 顺便说一句,你应该提到从用户生成的旋转轴和角度生成四元数是微不足道的......
【解决方案2】:

在标准 3D 矩阵中,您只需要左上角的 3x3 值即可进行旋转。稍后要将矩阵应用为 4x4,您需要将其他值设为 0,而不是对角线。

这是一个仅旋转矩阵,其中的值 vXY 给出了旋转。

[v00 v01 v02  0]
[v10 v11 v12  0]
[v20 v21 v22  0]
[  0   0   0  1]

有趣的是,这些值构成了您将对象旋转到的坐标系的基础,因此在新系统中,x 轴沿 [v00 v01 v02],y 轴沿 [v10 v11 v12]和 z 轴显然 [v20 v21 v22]。

你可以在对象旁边显示这些轴,让另一个拖动它们来改变旋转,也许。

【讨论】:

  • 我喜欢这个,但是很难手动输入值(例如从文本中)
  • 好的,我想也许你有某种鼠标用户界面。当然,输入和理解 9 个值并不容易..
【解决方案3】:

我会说这取决于用户,但对我来说最“用户友好”的方式是存储“roll”、“pitch”和“yaw”。这些是普通用户可以理解和调整的非常非技术性的术语,您应该很容易获取这些值并计算矩阵。

【讨论】:

  • 我可以轻松地将旋转矩阵设置为偏航俯仰滚动值,但我不知道如何从矩阵中获取它们
  • @tm1rbrt 我已经编辑了答案以显示获得这些值的一种可能方式
  • 哎呀,我刚刚意识到我的编辑完全有缺陷——删除它:)
【解决方案4】:

IMO,对旋转最“用户友好的格式”是存储欧拉 XYZ 角,这通常是任何 3D 内容创建软件中显示旋转的方式。

欧拉角很容易转换为矩阵,有关矩阵乘积,请参阅here

但是你不应该混淆提供给 GUI/用户的格式和数据的存储格式:欧拉 XYZ 角度在做动画时有自己的问题,gimbal lock 会引入不需要的行为.

存储/计算旋转的另一个候选者是quaternions。它们比 XYZ 角度具有数学优势,主要是在两次旋转之间进行插值时。当然,您不想将四元数值直接暴露给任何人类用户,您需要将它们转换为 XYZ 角度。你会在网上找到大量的代码。

我不建议直接以矩阵格式存储旋转。从中提取用户友好的值很困难,它不提供任何有趣的动画/插值行为,它需要存储。 IMO,需要在需要转换几何时创建矩阵。

总之,有几个选项,您应该选择最适合您的选项。你是否打算制作动画?等等

编辑 此外,您不应该将模型和视图矩阵合并。它们在语义上非常不同,并且仅出于性能原因在 OpenGL 中组合。我在上面的“模型矩阵”中想到了什么。视图矩阵通常由您的视图系统/相机管理器给出,并与您的模型矩阵相结合。

【讨论】:

    【解决方案5】:

    虽然数学“晦涩难懂”,但四元数却出人意料地用户友好,因为它表示围绕轴旋转给定角度。

    旋转轴只是一个指向该方向的单位向量,乘以旋转角度的 1/2 的正弦,“模糊”的第 4 个分量等于旋转角度 1/2 的余弦。

    第一眼感觉有点“不自然”,但一旦掌握了……还能再简单点吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2012-10-31
      • 2011-04-28
      • 2010-09-14
      • 2012-12-31
      • 2012-02-23
      • 2013-05-06
      相关资源
      最近更新 更多