OpenGL,世界到物体坐标映射?(逆矩阵)

4

大家好,

如图所示,

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();

如果我没错的话,(Ox, Oy, Oz)和(hx, hy, hz)是世界坐标。现在我想做的是计算H点(hx, hy, hz)相对于O的物体坐标系(x', y', z')的位置。据我理解,我可以通过计算对象O的逆变换并将其应用于点H来实现这一点。您有什么提示吗?OpenGL是否提供了逆矩阵计算函数?如果我找到了逆矩阵,它们的乘法顺序是什么?注意:我想要实现一个类似“锤子”工具,在H点处绘制一个半径为R的球体。用户可以使用此球体像锤子一样砍断对象O。我已经在2D中实现了这一点,因此如果我能计算出相对于(x',y',z')的锤子位置,我就可以使用相同的算法。谢谢!

1
如果我理解你的问题,那么它不就是{Ox - hx, Oy - hy, Oz - hz}(即glTranslatef(Ox - hx, Oy - hy, Oz - hz);)吗?如果你已经有了全局向量Oh,那么这只是一个简单的向量减法问题,完全不需要矩阵操作。顺便说一下,你原来的解决方案是正确的。 - MrGomez
嗨,我需要更改对象O的原始坐标。这意味着我需要比较对象坐标,而不是世界坐标。 - Ashika Umanga Umagiliya
1
没问题。快速回顾提醒我,OpenGL没有提供通用矩阵库。你需要使用一个单独的库,或者自己进行计算(http://mathworld.wolfram.com/MatrixInverse.html)。 - MrGomez
2个回答

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);

基本上,只需按照最初应用的相反顺序撤销每个已应用的变换。

2

是的,基本上你说得对,你可以通过翻译矩阵来执行此操作。

M = O^-1 * H

就像你已经猜到的那样,你需要O的逆运算。OpenGL并不是一个数学库,它只处理渲染问题。因此,您必须自己实现反演。搜索“高斯约旦”以找到一种可能的算法。如果您可以绝对确定O仅由旋转和平移组成,即没有剪切或缩放,则可以通过转置左上角的3x3子矩阵并否定右侧列的最上面3个元素来进行快捷操作(这利用了正交矩阵(如旋转矩阵)的性质,即转置也是逆,左上角的3x3是旋转部分,平移的逆是否定其向量的元素,这是右上方的3个元素)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接