2014-04-20 28 views
0

我通过将它与模型视图矩阵相乘来转换矢量。如何得到modelview矩阵的逆矩阵?

glGetDoublev(GL_MODELVIEW_MATRIX, cam); 
newX=cam[0]*tx+cam[1]*ty+cam[2]*tz+cam[3]; 
newY=cam[4]*tx+cam[5]*ty+cam[6]*tz+cam[7]; 
newZ=cam[8]*tx+cam[9]*ty+cam[10]*tz+cam[11]; 

如何获取逆向变换的模型视图矩阵的逆?

回答

1

好吧,呃,通过反转矩阵。这是一个标准的数学过程,你可以在字面上找到关于线性代数的每本教科书。所有的矩阵数学库都有一个反转矩阵的函数。 OpenGL不是矩阵数学库,所以它没有这个功能。看看像GLM,Eigen或linmath.h的图书馆

+0

我这样做,但没有奏效。 :( –

+0

从某种意义上说,你没有得到正确的倒置矩阵,或者你在使用它的时候没有得到想要的结果?如果你写了一个反演算法,或者从某个地方得到了一个,我会一直测试它,并给它一些示例矩阵,并通过检查单位矩阵中两个结果的乘积来验证它是否产生了正确的逆矩阵 –

+0

@ShashiMishra:您可能会被OpenGL(和大多数其他图形库)排序他们的矩阵:它们通常按列的主要顺序排列,即首先是第一列的元素,然后是第二列的元素,然后大多数人天真地假定行的主要顺序,并反转操作顺序 – datenwolf

2

你在发布的代码中有什么不是正确的应用MODELVIEW矩阵的方式。 OpenGL使用矩阵的列主要顺序。您的计算需要是这样的:

newX=cam[0]*tx+cam[4]*ty+cam[8]*tz+cam[12]; 
newY=cam[1]*tx+cam[5]*ty+cam[9]*tz+cam[13]; 
newZ=cam[2]*tx+cam[6]*ty+cam[10]*tz+cam[14]; 

对于逆矩阵,你可以只使用一个通用的矩阵求逆算法,如@datenwolf已经建议。如果您可以对矩阵做出某些假设,则有更简单和更有效的方法。一个典型的例子是,你知道你的变换矩阵只包含旋转,平移和缩放。在这种情况下,您可以将这些矩阵拆分为这些分量,将每个矩阵反转,然后将它们重新组合到倒置矩阵中。由于旋转,平移和缩放都是微不足道的,所以可以用非常简单的数学来完成。

+0

+1注意到,对于MV矩阵来说,逆矩阵的计算通常比一般情况下要简单一个数量级。 – vaxquis