4

大家好,

如图所示,

替代文字

我有一个名为 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') 的锤子位置,则使用相同的算法

提前致谢。

4

2 回答 2

2

是的,基本上你是对的,你可以通过翻译矩阵来执行这个操作

M = O^-1 * H

任何你已经猜到的你都需要 O 的倒数。OpenGL 不是一个数学库,它只处理渲染的东西。所以你必须自己实现反转。谷歌搜索“Gauss Jordan”以找到一种可能的算法。如果您可以绝对确定 O 仅由旋转和平移组成,即没有剪切或缩放,那么您可以通过转置左上角 3x3 子矩阵并否定最右列的最上面的 3 个元素来进行捷径(这利用了正交的性质矩阵,如旋转矩阵,转置也是逆矩阵,左上角的 3x3 是旋转部分,平移的逆矩阵是其向量的元素,即最右边的上 3 个元素)。

于 2010-12-07T09:34:30.820 回答
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);

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

于 2010-12-07T09:52:02.403 回答