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

标签 c++ opengl matrix rotation quaternions

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

最佳答案

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

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

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

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

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

关于c++ - 从模型矩阵或四元数中找到最终的世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9912357/

相关文章:

c++ - OpenGL 引用系

python - 将 2D numpy 数组转换为 2D numpy 矩阵

matlab - x( :) and x(1:end) are different 的矩阵索引输出

c++ - 无法弄清楚为什么只从文件中读取一行矩阵以及为什么我不能将二维数组传递给函数

c++ - 访问 CV_32SC1 nx1 opencv 矩阵

c - OpenGL - 帧缓冲区深度纹理不同于颜色深度纹理

c++ - 纹理周围的边框,OpenGL

c++ - 对结构略有不同的统一 View

c++ - C++ 中传递的参数不完整

c# - 以更人性化的方式编码 char**