Opengl 初学者';s关于模型到世界坐标映射的混淆

Opengl 初学者';s关于模型到世界坐标映射的混淆,opengl,matrix,3d,Opengl,Matrix,3d,正如我们所知,OpenGL为映射点维护modelview和投影矩阵 如果仔细观察,我将modelview矩阵划分为: mat4 modelview=WorldViewMtx*ModelWorldMtx 嗯,我不明白的是ModelWorldMtx是如何计算出来的 例如,如果我们在2D中有模型坐标(MC)和世界坐标(WC),如下所示: MC a=[1;1;1](齐次坐标中的列向量,我用类似于Matlab的方式表示)中映射到WC的点是b=Ma=[-1 0 4;0 1 3;0 1][1;1;1]=[3

正如我们所知,OpenGL为映射点维护modelview和投影矩阵

如果仔细观察,我将modelview矩阵划分为: mat4 modelview=WorldViewMtx*ModelWorldMtx

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

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

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

如果我们在二维样式中应用gltranslate(1.0,0.0,0.0),则平移矩阵为T=[1 0 1.0;0 1 0.0;0 0 1]。因此,点a将以这种方式映射到WC:

b'=MTa=[-104;0113;011][101.0;0110.0;011][1;1;1]=[2;4;1]

在这个例子中,ModelWorldMtx到底是什么

在我看来,像glTranslate、glScale这样的仿射变换函数只是在模型坐标中工作。如果在这种情况下MC和WC不重合

因此ModelWorldMtx=MT=[-104;0113;011][101.0;0110.0;011]=[-103;0113;011]

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

我说得对吗

正如我们所知,OpenGL为映射点维护modelview和投影矩阵

事实上,从OpenGL-3开始就没有了。内置矩阵堆栈已被弃用,并已从OpenGL-3.3 core及更高版本中删除

如果仔细观察,我将modelview矩阵划分为:

mat4 modelview = WorldViewMtx * ModelWorldMtx
不,modelview矩阵只是

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相当愚蠢。当然,现在我们用着色器做所有的事情,上面部分的前两行可以是任何可以用图灵完全语言表达的东西。

问题到底是什么?“那么在这个例子中,ModelWorldMtx到底是什么?”它是您定义的任何东西。您刚刚完成了两个转换的组合,得到了预期的结果。但我不明白你在问什么。