OpenGL,World to Object坐标映射? (逆矩阵)

时间:2010-12-07 04:22:08

标签: opengl matrix geometry matrix-inverse

问候所有人,

如图所示,

alt text

我有一个名为O(一组线条)的对象。它的对象坐标系是(x',y',z')。 我翻译,使用以下代码片段在我的OpenGL场景中旋转此对象:

glPushMatrix();
 glTranslatef(Oz, Oy,Oz);
 glRotatef(rotationX , 1.0, 0.0, 0.0);  
 glRotatef(rotationY, 0.0, 1.0, 0.0);
 glRotatef(rotationZ, 0.0, 0.0, 1.0); 
contour->render();
glPopMatrix()

我有一个名为H的点,使用

转换为(hx,hy,hz)世界坐标
glPushMatrix();
 glTranslatef(hx,hy,hz);
glPopMatrix();

如果我是对的,(Oz,Oy,Oz)和(hx,hy,hz)是世界坐标。

现在,我想要的是计算H(hx,hy,hz)相对于O物体坐标系的位置。(x',y',z') ; 据我所知,我可以通过计算对象O的逆变换并将它们应用到H点来实现。

有关此的任何提示吗? OpenGL是否为逆矩阵计算提供了任何功能?如果我以某种方式发现逆矩阵的乘法顺序是什么?

注意:我想实施"锤子"就像在H点的工具一样,我绘制一个半径为R的球体。用户可以用这个球体像锤子一样切割物体O.我已经在2D中实现了这个,所以如果我可以计算锤子的位置,我可以使用相同的算法 相对于(x',y',z')

提前致谢。

2 个答案:

答案 0 :(得分:2)

是的,基本上你是对的,你可以通过翻译矩阵

执行此操作

M = O ^ -1 * H

任何像你已经猜到的那样,你需要O的倒数。 OpenGL不是一个数学库,它只处理渲染的东西。所以你必须自己实现反演。谷歌为“高斯乔丹”寻找一种可能的算法。如果你可以绝对肯定,O只包括旋转和平移,即没有剪切或缩放,那么你可以通过转置左上3x3子矩阵并取消最右边列的最上面3个元素来快捷方式(这利用了正交的性质)矩阵,如旋转矩阵,转置也是反向的,左上角3x3是旋转部分,平移的倒数是否定它的向量的元素,它是最右边的上3个元素。)

答案 1 :(得分:2)

反转矩阵将是一般解决方案,但据我所知,这实际上不是一个“一般”问题。您尝试与已知的转换序列相反,而不是撤消任意转换,每个转换都可以非常简单地反转。如果您的对象到世界的转换是:

glTranslatef(Ox, Oy, Oz);
glRotatef(rotationX , 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);
glRotatef(rotationZ, 0.0, 0.0, 1.0);

然后世界到物体的反转就是:

glRotatef(-rotationZ, 0.0, 0.0, 1.0);
glRotatef(-rotationY, 0.0, 1.0, 0.0);
glRotatef(-rotationX , 1.0, 0.0, 0.0);
glTranslatef(-Ox, -Oy, -Oz);

基本上,只需按照最初应用的相反顺序退出每个应用的转换。