初学者对模型到世界坐标映射的困惑

时间:2014-09-01 01:16:17

标签: opengl matrix 3d

我们知道OpenGL维护了映射点的模型视图和投影矩阵。

仔细观察,我将模型视图矩阵划分为: mat4 modelview = WorldViewMtx * ModelWorldMtx

嗯,我不明白的是ModelWorldMtx如何计算

例如,如果我们在2D中有模型corrdinates(MC)和世界坐标(WC),如下所示: MC And WC

MC中的点a = [1; 1; 1](齐次坐标中的列向量,我在Matlab中表达方式),映射到WC是b = M a = [ - 1 0 4; 0 1 3; 0 0 1] [1; 1; 1] = [3; 4; 1],我将M作为两个坐标之间的转移矩阵(我的意思是,基矢量之间的关系矩阵)两个坐标)。

如果我们在2D样式中应用gltranslate(1.0,0.0,0.0),则转换矩阵为T = [1 0 1.0; 0 1 0.0; 0 0 1]。因此,以这种方式将一个意志映射到WC:

B' = M T a = [ - 1 0 4; 0 1 3; 0 0 1] [1 0 1.0; 0 1 0.0; 0 0 1] [1; 1 ; 1] = [2; 4; 1]

所以在这个例子中,ModelWorldMtx究竟是什么?

在我看来,仿射变换函数如glTranslate,glScale只适用于模型坐标。如果在这种情况下MC和WC不一致,

所以ModelWorldMtx = M T = [ - 1 0 4; 0 1 3; 0 0 1] [1 0 1.0; 0 1 0.0; 0 0 1] = [ - 0 0 3; 0 1 3; 0 0 1]。

如果MC和WC在OpenGL中重合,则转换矩阵M是一个单位矩阵,因此ModelWorldMtx = T,也就是说在调用gltranslate之后,该点被映射到WC。

我是对的吗?

1 个答案:

答案 0 :(得分:0)

  

我们知道OpenGL维护了映射点的模型视图和投影矩阵。

实际上,从OpenGL-3开始,它没有。内置的矩阵堆栈已被弃用并从OpenGL-3.3内核中删除。

  

仔细观察,我将模型视图矩阵划分为:

mat4 modelview = WorldViewMtx * ModelWorldMtx

不,模型视图矩阵只是

mat4 modelview

它不会自然地分成子矩阵。当然,你可以通过连续乘以多个矩阵来组成一个同质的变换矩阵,但结果只是一个矩阵。

当调用glTranslate,glScale或类似函数时,它们正在有效地替换当前的M,其结果是将该矩阵与平移,缩放或此类矩阵相乘。

  

我是对的吗?

不完全。你基本上是在思考这个问题。旧的固定函数OpenGL管道中的转换过程是

pos_view = M · pos_local
pos_clip = P · pos_view

pos_clip'_0…1 = clip(pos_clip_0…1)

pos_NDC = pos_clip' / pos_clip.w

就是这样。没有什么比这更令人愉快了。 OpenGL相当愚蠢。当然,现在我们正在使用着色器进行所有操作,上面段中的前两行可以是任何可以用图灵完整语言表达的内容。