Matrix 是否可以提取modelview矩阵的模型部分?

Matrix 是否可以提取modelview矩阵的模型部分?,matrix,graphics,webgl,Matrix,Graphics,Webgl,(这是一个类似的问题)但我认为它更一般,所以我重新发布它 我在WebGL中有一个modelview矩阵,由从局部对象空间到世界空间的一系列变换组成,然后是从世界空间到齐次WebGL坐标的变换(-1到1) 这个矩阵是通过一系列复杂的步骤在我们的代码中建立起来的。其中一个步骤是渲染到纹理,然后将纹理blit到屏幕上。这个过程被提取出来进行推广,因此我们可以将其用于任何2D纹理绘制操作。不幸的是,它提供了自己的视图/投影转换。在我调用这个的时候,我只有组合的modelview矩阵 我想做的是保留在mo

(这是一个类似的问题)但我认为它更一般,所以我重新发布它

我在WebGL中有一个modelview矩阵,由从局部对象空间到世界空间的一系列变换组成,然后是从世界空间到齐次WebGL坐标的变换(-1到1)

这个矩阵是通过一系列复杂的步骤在我们的代码中建立起来的。其中一个步骤是渲染到纹理,然后将纹理blit到屏幕上。这个过程被提取出来进行推广,因此我们可以将其用于任何2D纹理绘制操作。不幸的是,它提供了自己的视图/投影转换。在我调用这个的时候,我只有组合的modelview矩阵

我想做的是保留在modelview矩阵上进行的转换,因为它是沿途构建的,但我不想包括视图转换。换句话说,给定一个模型视图矩阵和一个已知的视图转换,是否有方法将模型转换提取为矩阵


我们不使用透视投影,而且我们所有的变换本质上都是二维的,所以不需要一个通用的解决方案(虽然我以前在3D中工作时遇到过这个问题,所以可以扩展到3D的东西会非常有用)。

如果我理解正确,你就有了
逆(V)*M
modelview
中,您正在以增量方式构建它。这意味着在代码中,您正在执行以下操作:

glMatrixMode(GL\u模型视图)
glLoadIdentity();
... 这里是V变换。。。
... 这里是M变换。。。
... 这是渲染还是其他什么。。。
对于多个对象,这些内容通常如下所示:

glMatrixMode(GL\u模型视图)
glLoadIdentity();
... 这里是V变换。。。
用于(所有对象)
{
glPushMatrix();
…这里是M变换。。。
…在这里渲染或其他。。。
glPopMatrix();
}
因此,要获得
V
,您可以执行以下操作:

glMatrixMode(GL\u模型视图)
glLoadIdentity();
... 这里是V变换。。。
双iV[16],iVM[16];
glGetDoublev(GLU模型视图矩阵,iV);
用于(所有对象)
{
glPushMatrix();
…这里是M变换。。。
glGetDoublev(GLU模型视图矩阵,iVM);
…在这里渲染或其他。。。
glPopMatrix();
}
现在:

iVM=iV*M
V*iVM=V*iV*M
V*iVM=M
其中
V=Inverse(iV)
保存直接视图矩阵,
M
保存直接模型矩阵。由于OpenGL没有逆矩阵,您可以通过转置+位置计算来实现,请参见:

请参见此处的
矩阵\u inv
函数,结果如下:

double M[16],V[16];
矩阵_inv(V,iV);
矩阵μmul(M,V,iVM);
其中
matrix\u mul
code您可以在这里找到:


那么你是说你知道
V*M
V
,你想得到
M
?那么它应该像
inverse(V)*(V*M)
一样简单。再加上@HolyBlackCat所说的,如果你不知道
V
,那你就倒霉了。这和说A=11,B=12没什么区别。给定数字23,不知道A或B是什么。不知道V,你就不能知道M。如果你知道V,尽管你可以将其删除为@HolyBlackCat提到的@HolyBlackCat.@HolyBlackCat模型视图保持
Inverse(V)*M
V
在那里是反向的!!!我确实知道视图矩阵,所以这是一个可能的选择。这不是OpenGL的问题。WebGL中没有
glMatrixMode
glPushMatrix
等。事实上,在OpenGL中,这些函数已经被弃用超过10年了。@gman你是对的,但这个问题更一般地说是关于如何得到逆矩阵。即使函数不存在,该过程也可能工作。@jwir3我不为WEBGL编写代码,但无论使用哪种api,该机制都是相同的。你只需要检查哪个矩阵是正的,哪个矩阵是逆的,乘法顺序是什么。。。顺便说一句,我知道旧的GL api已被弃用,我也使用了新的api,但旧的api更容易制作示例,而且更可靠,因为新的东西经常因为糟糕的驱动程序而出现错误。尽管问题不是关于OpenGL,但我接受这个答案,因为理论是合理的,我成功地将其应用到WebGL。