是否可以提取模型视图矩阵的模型部分?

时间:2018-07-18 21:49:37

标签: matrix graphics webgl

(这是与extracting scale matrix from modelview matrix类似的问题),但我认为它有点笼统,因此我将其重新发布。

我在WebGL中有一个模型视图矩阵,由从本地对象空间到世界空间的一系列转换组成,然后是从世界空间到同构WebGL坐标的转换(在各个方向上为-1到1)。

此矩阵是在我们的代码中通过一系列复杂的步骤构建的。这些步骤之一是渲染到纹理,然后将纹理涂抹到屏幕上。提取此过程进行一般化,因此我们可以将其用于任何2D纹理绘制操作。不幸的是,它提供了 own 视图/投影转换。在我所说的这一点上,我只有组合的模型视图矩阵。

我想做的是保留在模型视图矩阵上进行的转换,因为它是在构建过程中建立的,但是我不想包含视图转换。换句话说,给定模型视图矩阵和已知视图转换,是否有办法将模型转换 just 提取为矩阵?

我们不使用透视投影,并且我们所有的变换本质上都是二维的,因此不需要通用的解决方案(尽管在3D工作中我曾遇到过这个问题,因此可以扩展一些内容到3D将会非常有用)。

1 个答案:

答案 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代码的位置: