(这是与extracting scale matrix from modelview matrix类似的问题),但我认为它有点笼统,因此我将其重新发布。
我在WebGL中有一个模型视图矩阵,由从本地对象空间到世界空间的一系列转换组成,然后是从世界空间到同构WebGL坐标的转换(在各个方向上为-1到1)。
此矩阵是在我们的代码中通过一系列复杂的步骤构建的。这些步骤之一是渲染到纹理,然后将纹理涂抹到屏幕上。提取此过程进行一般化,因此我们可以将其用于任何2D纹理绘制操作。不幸的是,它提供了 own 视图/投影转换。在我所说的这一点上,我只有组合的模型视图矩阵。
我想做的是保留在模型视图矩阵上进行的转换,因为它是在构建过程中建立的,但是我不想包含视图转换。换句话说,给定模型视图矩阵和已知视图转换,是否有办法将模型转换 just 提取为矩阵?
我们不使用透视投影,并且我们所有的变换本质上都是二维的,因此不需要通用的解决方案(尽管在3D工作中我曾遇到过这个问题,因此可以扩展一些内容到3D将会非常有用)。
答案 0 :(得分:1)
如果我做对了,您在Inverse(V)*M
中有modelview
,并且您正在逐步构建它。这意味着在代码中您正在执行以下操作:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
... here V transforms ...
... here M transforms ...
... here render or whatever ...
具有多个对象的东西通常看起来像这样:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
... here V transforms ...
for (all objects)
{
glPushMatrix();
... here M transforms ...
... here render or whatever ...
glPopMatrix();
}
因此要获得V
,您可以这样做:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
... here V transforms ...
double iV[16],iVM[16];
glGetDoublev(GL_MODELVIEW_MATRIX,iV);
for (all objects)
{
glPushMatrix();
... here M transforms ...
glGetDoublev(GL_MODELVIEW_MATRIX,iVM);
... here render or whatever ...
glPopMatrix();
}
现在:
iVM = iV*M
V * iVM = V*iV*M
V * iVM = M
其中V = Inverse(iV)
保存直接视图矩阵,而M
保存直接模型矩阵。由于OpenGL没有逆矩阵,因此可以通过转置+位置计算来实现,请参见:
请参见其中的matrix_inv
函数,结果将是:
double M[16],V[16];
matrix_inv(V,iV);
matrix_mul(M,V,iVM);
您可以在此处找到matrix_mul
代码的位置: