1.坐标系
在计算机图形学中有关于坐标系的内容。常见的三维坐标系有两种:左手坐标系和右手坐标系。这两种坐标系没有本质的差别,在具体的应用中,他们的作用完全是一样的。唯一需要注意的是,不能在一个系统中同时使用两个坐标系统,这样会是相当混乱的。常见的错误是你使用的图形库使用的一种坐标系统,而在你头脑中使用的却是另外一种坐标系统。OpenGL使用的右手坐标系.
2.矩阵
OpenGL中的矩阵表示是以列优先,而不是C语言的行优先。这里我们可以用(a1, a2, a3, ... a16)表示4*4矩阵中的16各元素。
在以行优先的情况下,(a1,a2,a3,a4)表示的是第一行的四个元素,(a5,a6,a7,a8)表示的是第二行的四个元素,其他的与此类推。具体的矩阵可以表示为:
(a1, a2, a3, a4 )
(a5, a6, a7, a8 )
(a9, a10, a11, a12)
(a13, a14, a15, a16)
在以列优先的情况下,(a1,a2,a3,a4)表示的是第一列的四个元素,(a5,a6,a7,a8)表示的是第二列的四个元素,其他的与此类推。具体的矩阵可以表示为:
(a1, a5, a9, a13)
(a2, a6, a10, a14)
(a3, a7, a11, a15)
(a4, a8, a12, a16)
和坐标系一样,在OpenGL中注意不要把行优先和列优先混在一个用。OpenGL中的矩阵是以列优先的形式排列的。
3.矩阵的左乘和右乘
在计算机图形学中,矩阵通常被用来描述Geometrical Transformation,而矩阵的乘可以被看作是Geometrical Transformation的一个应用,乘积的结果表示的是变化后的结果。由矩阵的乘法规则我们可以看出,对于一个点P:
1. 如果P写成行的形式,即(x,y,z,1),对P的变换应该使用矩阵右乘:P' = (x,y,z,1)TM
2.如果P写成列的形式,即(x,y,z,1)T,对P的变换应该使用矩阵左乘:P' = M(x,y,z,1)T
由于OpenGL中的矩阵是以列优先的形式排列的,为了能够按顺序获取矩阵中的每一项,我们最好使用矩阵右乘的形式:
x' = x*a1 + y*a2 + z*a3 + 1*a4;
y' = x*a5 + y*a6 + z*a7 + 1*a8;
z' = x*a9 + y*a10 + z*a11 + 1*a12;
所以OpenGL中应该将点(或者向量)写成行的形式并且在变换的过程中使用矩阵的右乘。
PS:对于这个问题,我又进行了一些思考。其实,左乘和右乘都不重要,也不需要死记硬背,我们只要在使用的过程中明确以下两点:
1.从数学的角度,矩阵的乘法运算需要满足矩阵运算的法则。不是任何两个矩阵M,N都可以进行乘法预算,它们的维数要满足一定的条件。
2.从计算机图形学角度,我们需要明确矩阵代表的实际意义。在计算机图像学中,矩阵可以用来表示各种各样的变换,其中最常见的就是几何变换;同时矩阵也可以被用来表示基(或者说坐标系)的变换。
4.世界坐标系原点
在学习计算机图形学的初期,我一直在试图寻找世界坐标系原点的初始位置。在视窗口的左下角?在视窗口的中间?这个问题困扰了我很长一段时间,直到后来我才认识到:世界坐标系原点的初始位置和视窗口没有任何关联,问题的关键仅在于视点(即"摄像机")相对于世界坐标系原点的位置。我们可以把我们的眼睛想像成"视点",把我们周围的物体看作是"世界坐标系"中的物体,在现实世界中,我们从来就不会去关心世界坐标系原点在那里,我们只关心什么物体能够呈现在我们的眼睛了,同样的道理一样也适用于计算机模拟出来的"虚拟世界"。
5.视点的初始位置和方向
伴随着前一个问题的解决衍生出一个新的问题:视点的初始位置和方向是什么样的?视点的初始位置应该是相对于世界坐标系原点,不同的API有不同的设置,在OpenGL中:
1) 视点的初始位置位于世界坐标系的原点
2) 视点的初始视方向和Z轴负方向一致
3) 视点的初始向上方向和Y轴的正方向一致
4) 视点的初始X方向和X轴的正方向一致
PS:由于OpenGL采用右手坐标系,所以视点的初始视方向垂直于屏幕指向屏幕的内部。
未完待续。。。
历史:
12/02/2006:添加了"坐标系"和"矩阵"两个常识。
01/09/2007:添加了"矩阵的左乘和右乘"这个常识。
02/09/2007:添加了对"矩阵的左乘和右乘"的一些补充理解。
02/11/2007:添加了"世界坐标系原点"和"视点的初始位置和方向"两个常识。