【问题标题】:OpenGL ,World to Object coordinate mapping ? (inverse matrix)OpenGL,世界到对象坐标映射? (逆矩阵)
【发布时间】:2013-06-30 04:52:37
【问题描述】:

大家好,

如图所示,

我有一个名为 O(线条集)的对象。它的对象坐标系是 (x',y',z')。 我使用以下代码 sn-p 在我的 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')

提前致谢。

【问题讨论】:

  • 如果我理解你的问题,不就是{Ox - hx, Oy - hy, Oz - hz}(即glTranslatef(Ox - hx, Oy - hy, Oz - hz);)吗?如果您已经有了全局向量Oh,那么这只是向量减法的简单问题,矩阵操作完全不在等式中。顺便说一句,您最初的解决方案听起来是正确的。
  • 嗨,我必须更改对象 O 的原始对象坐标。也就是说,我必须比较对象坐标,而不是世界坐标。
  • 不用担心。快速复习提醒我 OpenGL 不提供通用矩阵库。您需要为此使用单独的库,或者自己执行计算 (mathworld.wolfram.com/MatrixInverse.html)。

标签: opengl matrix geometry matrix-inverse


【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多