问候所有人,
如图所示,
我有一个名为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')
提前致谢。
答案 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);
基本上,只需按照最初应用的相反顺序退出每个应用的转换。