我正在使用对象的模型矩阵在OpenGL中显示一个对象,我从预先存储的对象位置和应用于旋转的四元数构建。我需要在应用的旋转和变换(对象在屏幕上显示的坐标)之后找到我的对象的最终笛卡尔坐标 3D 。如何获得普通坐标?
答案 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()
并应用除视口转换之外的所有内容。