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

Posted

技术标签:

【中文标题】从模型矩阵或四元数中找到最终的世界坐标【英文标题】:Find final world coordinates from model matrix or quaternion 【发布时间】:2012-03-28 17:04:43 【问题描述】:

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

【问题讨论】:

我不确定你在问什么...将矩阵与点坐标向量相乘?但是,如果要获取屏幕上的位置,还需要考虑相机矩阵。 @cooky451:视图矩阵只有一个,还有投影矩阵(千万不要和相机混淆!)和归一化步骤。 我正在尝试获取对象的世界坐标,并应用旋转(最终位置)。我没有在原点旋转对象,因此由于在非原点位置旋转,对象有一些偏移。我需要找到我看到的那个位置。 【参考方案1】:

如果我理解正确,你有一个对象;如果您在不应用任何转换的情况下渲染它,它的中心将位于 [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];

这告诉您模型视图矩阵将模型的原点移动到哪里。

【讨论】:

我确实以类似的方式实现了该方法,但这似乎更简单。很好的答案,我相信我会在我即将推出的未来项目中使用你的方法:) 谢谢,这帮助了我。仅供参考,glGetDoublev 应该有一个小写的 v。我会编辑您的回复以自己更改它,但我似乎不允许进行单字符编辑。【参考方案2】:

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

【讨论】:

会不会有点矫枉过正?我对矩阵和投影不是很好,如果有更简单的方法,它应该是最后的选择?或者如果 gluProject 很简单,我在哪里可以找到它的简单解释(我发现的那些令人困惑) 还是推送当前矩阵,将身份加载为视图矩阵并将我的模型矩阵加载为模型视图矩阵,并调用 gluProject 工作?

以上是关于从模型矩阵或四元数中找到最终的世界坐标的主要内容,如果未能解决你的问题,请参考以下文章

我可以在四元数中切换 X Y Z 吗?

四元数

轴角与四元数的利弊

如何将欧拉角转换为四元数并从四元数中得到相同的欧拉角?

四元数(Quaternion)和旋转

Unity四元数和旋转