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

C++ 从模型矩阵或四元数中查找最终世界坐标,c++,opengl,matrix,rotation,quaternions,C++,Opengl,Matrix,Rotation,Quaternions,我使用对象的模型矩阵在OpenGL中显示一个对象,该模型矩阵是我根据预先存储的对象位置和应用于旋转的四元数构建的。在应用旋转和变换后,我需要在3D中找到对象的最终笛卡尔坐标(对象在屏幕上显示的坐标)。如何获取平面坐标?重新实现并应用视口变换以外的所有内容。重新实现并应用视口变换以外的所有内容。如果我理解正确,您有一个对象;如果在不应用任何变换的情况下渲染它,其中心将位于[0,0,0] 在三维空间中有一个点,[a,b,c]。将转换应用于modelview矩阵。现在,如果渲染对象,其中心将位于世界空

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

重新实现并应用视口变换以外的所有内容。

重新实现并应用视口变换以外的所有内容。

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

在三维空间中有一个点,[a,b,c]。将转换应用于modelview矩阵。现在,如果渲染对象,其中心将位于世界空间坐标中的[a,b,c]

你有一个四元数,[qw,qx,qy,qz]。您,M,并将其应用于modelview矩阵。现在您想知道对象在世界空间中心的新坐标,[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
。将旋转应用于modelview矩阵时,矩阵乘法将在此处完成。因此,您可以从矩阵本身获取值:

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

这将告诉您modelview矩阵移动模型原点的位置。

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

在三维空间中有一个点,[a,b,c]。将转换应用于modelview矩阵。现在,如果渲染对象,其中心将位于世界空间坐标中的[a,b,c]

你有一个四元数,[qw,qx,qy,qz]。您,M,并将其应用于modelview矩阵。现在您想知道对象在世界空间中心的新坐标,[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
。将旋转应用于modelview矩阵时,矩阵乘法将在此处完成。因此,您可以从矩阵本身获取值:

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

这将告诉您modelview矩阵移动模型原点的位置。

我不确定您在问什么。。。将矩阵与点坐标向量相乘?但是,如果要获得屏幕上的位置,还需要考虑摄影机矩阵。@cooky451:视图矩阵只是一个部分,还有投影矩阵(不能与摄影机混淆!)和标准化步骤。我正在尝试获取对象的世界坐标,并应用旋转(最终位置).我没有在原点旋转对象,因此对象由于在非原点位置旋转而有一些偏移。我需要找到我看到的位置。我不确定你在问什么…将矩阵与点坐标向量相乘?但是,如果你想在屏幕上获得位置,你还需要考虑相机matr@cooky451:视图矩阵只是一个整体,还有投影矩阵(不能与相机混淆!)和标准化步骤。我正在尝试获取对象的世界坐标,并应用旋转(最终位置)。我没有在原点旋转对象,因此对象在非原点位置旋转时有一些偏移。我需要找到我看到的位置。这不是有点过分吗?我对矩阵和投影不太擅长,如果有更简单的方法,它应该是最后的选择。或者如果gluProject很简单,我在哪里可以找到simp对它的解释(我发现的那些是令人困惑的)或者推动当前矩阵,加载标识作为视图矩阵,加载我的模型矩阵作为模型视图矩阵,并调用gluProject是否可行?这不是有点过分吗?我对矩阵和投影不是很在行,如果有更简单的方法,它应该是最后的选择?或者如果gluProject很简单,我在哪里可以找到简单的解释对它的剖析(我发现的那些令人困惑)或者推动当前矩阵,加载标识作为视图矩阵,加载我的模型矩阵作为模型视图矩阵,并调用gluProject是否有效?我确实以类似的方式实现了该方法,但这似乎更简单。回答很好,我相信我将在我即将到来的未来项目中使用您的方法:)谢谢,这帮了我的忙。仅供参考,glGetDoublev应该有一个小写的v。我会自己编辑你的回复来更改它,但我似乎不被允许进行单个字符的编辑。我确实以类似的方式实现了该方法,但这似乎更简单。很好的回答,我相信我会在我未来的项目中使用你的方法,这很快就会到来:)谢谢,这帮了我的忙。仅供参考,glGetDoublev应该有一个小写的v。我会编辑你的回复,自己修改,但我似乎不被允许编辑一个字符。