【目标】:学习OpenGL中的坐标系统。
【参考】:
1、《计算机图形学(OpenGL版) (第三版)》 Francis著(本文主要涉及第三章~第七章)
2、《计算机图形学(OpenGL版) (第三版)》 Donald著
一、前言
坐标系应该是任何图像系统的基石。在学习Cocos2D的过程中,对着《权威指南》上草草结束的坐标系介绍,实在是看的一头雾水,找了本OpenGL书把这块研究了一下,大致算是清楚了其中的一些基本概念。这里总结一下,作为记录。
二、数学基础
1、齐次坐标
(对应图形学一书的第4.5节)
在三维空间中的一个点,通常用p = (x, y ,z) 这样的三维坐标来表示,如果要对这样一个点进行如下的简单的变换(即仿射变换,下面会提到)。那么其形式可以如下表示:
(式2.1 – 1)
或者用表示为
P2 = M * P1 + C (式2.1 – 2)
这样表示的变换存在一种不便:需要乘法和加法两次计算才能完成转换。回想多项式乘法会发现,(a+b)^n 的展开式相当之长,这样,当变换的次数很多时,这样的计算就会很复杂且不直观。
由此,引入了齐次坐标的概念:对于某个三维坐标点(x, y, z),增加一维w != 0,并对原三维坐标进行同样的缩放,形成新的四维坐标(wx, wy, wz, w),即是所谓齐次坐标。
引入了齐次坐标后,原式2.1-2 就可以改写为:
P2' = M' * P1' (式2.1 -3)
这样,只需要用乘法就可以完成所有的任务了。
2、点、向量 的齐次坐标表示
前面的齐次坐标表示实际上是“点”的齐次坐标表示。且在接触到投影矩阵之前(即在模型视图矩阵阶段),对于一个坐标点 P = (wx, wy, wz, w) 的 w值都是1,也必须是1。
而对于向量,若其原三维表示为 v = (x, y , z), 则在齐次坐标下的表示为 v’ = (x, y, z, 0)。即对于向量来说,齐次坐标表示就是在第四维上填0。
进一步的,从原来上来说,这里的第四维坐标w,实际上表示是否含有坐标轴原点O的信息。(坐标点可以理解为原点O移动向量p后的结果)
3、仿射变换
仿射变换的数学定义是:在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间,可以用式2.1-1表示。
那么在齐次坐标下, 由于在前面了解到点的齐次坐标表示都是 (x, y, z, 1),第四维必须是1。所以仿射变换可以表示为:
(式2.3 – 1)
4、基本的仿射变换
复杂的仿射变换可以通过多次进行基本的仿射变换来完成。这些基本的原子变换包括:平移、缩放、剪切、旋转变换。(Donald的书在这个地方讲的更数学一点,更加严谨)
4.1 平移
M =
其中,(mx, my, mz) 是平移量,也是新坐标系(移动后)的原点O,在原坐标系(移动前)下的坐标值。
注意,上面关于原点这个表述很有意思。如果变换看做点的移动,那么右边(式2.1-2中的P2)是原来的坐标,左边(P1)是新的坐标。但是如果看做是坐标系的移动,那么对于同一个点P,P2是老坐标,P1是新坐标。
在我们这里,新的原点O,其老坐标就是P2。
4.2 缩放
M =
其中,(Sx, Sy, Sz) 是缩放比例。很简单不解释了。
4.3 剪切
也有翻译为错位变换的,定义是某一维上(如Y)引入另一维的影响(如X),效果是方形变平行四边形。可以看 。根据两个维度的选择,矩阵略有不同。如果是Y上引入X的影响,则矩阵为:
M =
当f = 1时,效果图如下:
有山就有路,有河就能渡。