【问题标题】:Is it possible to extract the model portion of a modelview matrix?是否可以提取模型视图矩阵的模型部分?
【发布时间】:2018-07-19 16:27:55
【问题描述】:

(这与extracting scale matrix from modelview matrix 的问题类似)但我认为它更笼统,所以我重新发布它。

我在 WebGL 中有一个模型视图矩阵,由一系列从局部对象空间到世界空间的变换组成,然后是从世界空间到齐次 WebGL 坐标的变换(所有方向上从 -1 到 1)。

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

我想要做的是保留在模型视图矩阵上所做的转换,因为它是一路建立起来的,但我不想包括视图转换。换句话说,给定一个模型视图矩阵和一个已知视图变换,有没有办法将模型变换提取为一个矩阵?

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

【问题讨论】:

  • 所以你是说你知道V * MV,你想得到M?那么它应该像inverse(V) * (V * M)一样简单。
  • 补充@HolyBlackCat 所说的话,如果您不知道V,那么您就不走运了。这与说 A = 11,B = 12 没有什么不同。给定数字 23 并且不知道 A 或 B 是什么 A。不知道 V,您就无法知道派生 M。如果您知道 V,尽管您可以将其删除为 @提到了HolyBlackCat。
  • @HolyBlackCat 模型视图持有Inverse(V)*M V 在那里反转!!!
  • 我确实知道视图矩阵,所以这是一个可能的选择。

标签: matrix graphics webgl


【解决方案1】:

如果我做对了,你在modelview 中有Inverse(V)*M,你正在逐步构建它。这意味着在你的代码中你正在做这样的事情:

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 代码:

【讨论】:

  • 这不是 OpenGL 问题。 WebGL 中没有glMatrixModeglPushMatrix 等。事实上,在 OpenGL 中,这些函数已经被弃用了 10 多年。
  • @gman 你是对的,但这个问题更普遍地是关于如何获得逆矩阵。即使函数不存在,该过程也可能有效。
  • @jwir3 我不为 WEBGL 编写代码,但无论你使用哪个 api,机制都是一样的。您只需要检查哪个矩阵是直接的,哪个是逆矩阵以及乘法顺序是什么......顺便说一句。我知道旧的 GL api 已被弃用,我也使用新的,但旧的更容易制作示例且更可靠,因为新的东西通常由于驱动程序错误而出现错误。
  • 尽管问题与 OpenGL 无关,但我接受了这个答案,因为理论是合理的,并且我成功地将其应用于 WebGL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多