OpenGL模型视图矩阵4x4的紧凑表示

时间:2011-02-03 23:41:40

标签: c opengl 3d matrix rotation

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

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

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

(替代方法是存储旋转部分(4 * 3数字),但用户很难操纵这些)

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

5 个答案:

答案 0 :(得分:2)

虽然它们是经常使用的,但我忽略了使用欧拉角。它们是有问题的,因为它们只保留物体的指向方向,但不保留与该方向的位置。更重要的是:他们很容易发现gibal 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

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

有关详细信息,请参阅此文章。 http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在标准3D矩阵中,您只需要左上角的3x3值来进行旋转。要在以后将矩阵应用为4x4,您需要使其他值与对角线分开。

这是一个仅旋转矩阵,其中值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]。

您可以在对象旁边显示这些轴,让对方拖动它们以改变旋转。

答案 3 :(得分:0)

IMO,旋转最“用户友好的格式”是存储Euler XYZ角度,这通常是在任何3D内容创建软件中暴露旋转的方式。

欧拉角很容易转换为矩阵,有关所涉及的矩阵乘积,请参见here

但是你不应该混淆给予GUI /用户的格式和数据的存储格式:Euler XYZ角度在做动画时有自己的问题,gimbal lock可以介绍不受欢迎的行为。

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

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

总而言之,有几个选项,您应该选择最适合您的选项。你打算做动画吗?等

修改的 此外,您不应该使用模型和视图矩阵制作汞合金。它们在语义上非常不同,并且仅出于性能原因而在OpenGL中组合。我在上面的'模型矩阵'中想到了什么。视图矩阵通常由视图系统/摄像机管理器给出,并与模型矩阵结合使用。

答案 4 :(得分:0)

一个四元数,虽然数学是“模糊和不可理解的”令人惊讶的用户友好,因为它表示围绕轴旋转给定的角度。

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

乍一看感觉有点“不自然”,但是一旦掌握了它......它会变得更容易吗?