从模型矩阵或四元数中查找最终世界坐标

时间:2012-03-28 17:04:44

标签: c++ opengl matrix rotation quaternions

我正在使用对象的模型矩阵在OpenGL中显示一个对象,我从预先存储的对象位置和应用于旋转的四元数构建。我需要在应用的旋转和变换(对象在屏幕上显示的坐标)之后找到我的对象的最终笛卡尔坐标 3D 。如何获得普通坐标?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你有一个对象;如果您在不应用任何转换的情况下进行渲染,则其中心位于 [0,0,0]

你在3D空间中有一个点 [a,b,c] 。您将转换应用于模型视图矩阵。现在,如果你渲染了对象,它的中心将位于世界空间坐标中的 [a,b,c]

你有一个四元数, [qw,qx,qy,qz] 。您create a rotation matrix M ,并将其应用于模型视图矩阵。现在,您想知道对象在世界空间中心的新坐标 [a',b',c']

如果这是真的,那么最简单的方法就是自己进行矩阵乘法:

a' = m11*a + m12*b + m13*c
b' = m21*a + m22*b + m23*c
c' = m31*a + m32*b + m33*c

其中

    [m11 m12 m13]
M = [m21 m22 m23]
    [m31 m32 m33]

但也许你实际上并没有建立 M 。另一种方法是直接使用四元数,尽管这主要涉及构建旋转矩阵然后使用它。

不应该实际使用gluProject。将旋转应用于模型视图矩阵时,矩阵乘法在那里完成。所以你可以从矩阵本身获取值:

double mv[16];
glGetDoublev(GL_MODELVIEW_MATRIX,mv);
a' = mv[13];
b' = mv[14];
c' = mv[15];

这可以告诉您模型视图矩阵在哪里移动模型的原点。

答案 1 :(得分:1)

重新实施gluProject()并应用除视口转换之外的所有内容。