2014-09-01 57 views
1

正如我们所知,OpenGL维护映射点的模型视图和投影矩阵。初学者对模型到世界坐标映射的困惑

如果仔细观察,我把模型视图矩阵: MAT4模型视图= WorldViewMtx * ModelWorldMtx

好,什么我不明白是怎么ModelWorldMtx算出来

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

在MC一个点= [1; 1; 1](在均相列向量坐标,我表示它的像马的方式tlab)中,映射到WC的是b = M a = [ - 1 0 4; 0 1 3; 0 0 1] [1; 1] = [3; 4; 1]两个坐标之间的转换矩阵(我的意思是两个坐标的基矢量之间的关系矩阵)。

如果我们在2D风格中应用gltranslate(1.0,0.0,0.0),那么平移矩阵是T = [1 0 1.0; 0 1 0.0; 0 0 1]。因此,在这种方式指向映射到WC遗嘱:

B” = M Ť 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只是工作在模型coordinates.If 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] = [-1 0 3; 0 1 3; 0 0 1]。

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

我对不对?

+0

究竟是什么问题? “那么在这个例子中,ModelWorldMtx究竟是什么?”无论你如何定义它。你只是做了2个转换的组合,并得到了应该预期的结果。但我不明白你在问什么。 – derhass 2014-09-01 19:33:53

回答

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很愚蠢。当然,这些日子里,我们正在用着色器做所有事情,上面的段中的前两行可以是任何可以用图灵语言表达的东西。