OpenGL,世界到对象坐标映射?(逆矩阵)

OpenGL,世界到对象坐标映射?(逆矩阵),opengl,matrix,geometry,matrix-inverse,Opengl,Matrix,Geometry,Matrix Inverse,大家好, 如图所示 我有一个对象名为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->re

大家好,

如图所示

我有一个对象名为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的球体。用户可以使用这个球体像锤子一样切割对象。我已经在2D中实现了这一点,所以如果我可以计算锤子的位置,我可以使用相同的算法 相对于(x',y',z')


提前感谢。

是的,基本上您是对的,您可以通过翻译矩阵执行此操作

M=O^-1*H


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

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

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

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

如果我理解你的问题,它不就是
{Ox-hx,Oy-hy,Oz-hz}
(即,
glTranslatef(Ox-hx,Oy-hy,Oz-hz);
)?如果你已经有了你的全局向量
O
h
,这是一个简单的向量减法问题,将矩阵操作完全排除在方程之外。顺便说一下,你的原始解决方案听起来是正确的。嗨,我必须更改对象O的原始对象坐标。这意味着,我必须比较对象坐标,not world-coordinates。别担心。快速复习提醒我OpenGL不提供通用矩阵库。你需要使用单独的库,或者自己执行计算()。