OpenGL常识汇总

来源:互联网 发布:mac刷新页面的快捷键 编辑:程序博客网 时间:2024/05/01 22:34
主题:这里将收集一些OpenGL中的常识。在日常生活中,我们积累生活常识越多,我们的生活就会越方便。同样的道理,如果我们积累的OpenGL常识越多,我们的开发过程就会越轻松。当列举这些常识的时候,我会尽量找到充分的,权威的资料去证明常识的正确性。通常情况下,我会摘抄经典书籍中的原话作为证据。闲话少数,现在就开始吧。

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采用右手坐标系,所以视点的初始视方向垂直于屏幕指向屏幕的内部。

0 0