关于坐标系系统
在图形渲染管线中,坐标系系统扮演了一个非常重要的角色,他们并不是很复杂。当我们在学校学习几何的时候,第一个接触到的就是坐标。不过,还是让我们来先见识一下这些东西,这将使得我们更容易理解矩阵的概念。
在前一篇文章中我们讨论了关于点、向量的概念。在那里,点和向量都是由三个实数来表示的,但是那些数字到底有什么意义呢?每个一个实数表示一个他们到原点的距离。比如,我们画一条直线,并且在线的正中间标记一个点,我们说这个点就是原点。此时这个点就是用于我们去衡量距离的一个参考点。如果一个点在原点的右边,我们把它的距离表示为大于0的数,如果一个点在原点的左边,我们把它的距离用小于0的数来表示。
我们假设一条线,向原点的两边无限延伸,这样一来,两个端点的距离就是无穷大。在数学上,这并没有什么问题,但是在计算机的世界里,这就有问题了。一般而言,我们只能计算有限范围内的东西。不过,这有限的大小其实已经足够我们去创建复杂的3D世界了,所以这并不会对我们产生什么实质的影响。
现在我们在这条线上画上刻度,这样一来,这条线就可以用来丈量长度。于是我们可以用它来衡量一个点的坐标位置到底是多少。在计算机里,这个刻度尺我们管它叫坐标轴。
如果某一个点不在坐标轴上,我们依然可以把它的位置投影到坐标轴上去。投影点与原点的距离就是我们这个点相对于原点的坐标位置了。
我们已经在不经意之间说完了在一条坐标轴上定义一个点的坐标位置了。
维度和笛卡尔坐标系
让我们把水平的那条线当成是x轴。我们可以接着绘制第二条坐标轴,这条坐标轴穿过原点垂直于x轴。我们叫这条坐标轴为y轴。从此刻开始,对于任意一个点,我们可以将他们分别投影到x和y轴上,然后计算投影点到原点的距离,并用用此来表示该点的坐标位置了。这样的位置包含两个数,两个数分别表示x轴坐标和y轴坐标。所以,我们可以说,我们用两个坐标轴,就可以定义一个二维空间。
比如,在一张纸上画上一堆点。这张纸占据了一个二维空间。可以看成是一个平面。我们可以为每个维度画一个坐标轴。如果我们再次使用x和y轴来衡量每个点的位置,这俩坐标轴就构成了一个坐标系统。如果这两个坐标轴是互相垂直的,那么我们管它叫:笛卡尔坐标系。
我们一般用一组有着明确先后顺序的申明来表示一个点的坐标。这两个记号用逗号隔开。对于笛卡尔坐标系来说,我们一般的把x轴的坐标写在前面,y轴的坐标卸载后面。比如,我们会将一个x坐标为2.5,y坐标为2.25的点记做(2.5,2.25)。但是你也别被这两个东西吓着了,他们只是标记了这个点到原点的位置关系。
到现在为止,我们已经搞懂了,如何制作一个2D坐标系,并且在这个坐标系中定义2D的点。你还需要明确的是,这些点的2D坐标是唯一的。意思就是说,在同一个坐标系下同一个坐标所表示的点不可能出现在不同的位置上。你还需要知道的是,世界上不止有标准坐标系,坐标系的坐标轴不一定非得是水平和垂直的,你爱怎么摆放你的坐标系都行。
事实上,我们可以在一个平面上定义无数多个坐标系。为了简单,我们假设,我们在纸上画了两个笛卡尔坐标系。并且,我们在这个纸上放了一个点。此时点的坐标会因为参考坐标系的不一样而变得不一样,虽然他们的物理位置是不变的。比如说:
点P在A坐标系下的坐标是(-1,3),在B坐标系下的坐标却是(2,4)。然而他们表达的是同一个点。是不是想起来OpenGL中的那些坐标了?对OpenGL矩阵在干嘛是不是又增进了一丢丢理解?
所以,如果我们知道B坐标系下点P的坐标,我们需要什么样的东西来求得A坐标系下,该点的坐标呢?这个原理在我们的计算机图形学里尤为重要。我们将很快会学到,如何将一个点的坐标从一个坐标系系统映射到另一个坐标系系统。
现在,我们来考量前面的例子。我们可以通过将坐标(-1,3)加上(3,1)来达到将P点的坐标从A坐标系映射到B坐标系的效果。并且给坐标(2,4)加上(-3,-1)可以将P点的坐标从B坐标系映射到A坐标系。我们这里要注意的是,(-3,-1)和(3,1)刚好是互逆的。也就是关键字:inverse。
另一个比较常见的操作就是讲一个点从坐标系的一个位置移动到另一个位置,此时参考坐标系并没有改变。这种操作叫做平移操作。这也是最基本的操作。其实其他的所有线性变换也是可以应用到点上去的。给点的坐标乘上一个常数,会对点的坐标产生缩放的影响。对点进行缩放,在空间上会表现为,点会沿着连接它与原点的直线进行运动。
另外请学习引擎课程的同学务必看完我们提供的全套所有文字资源,虽然有些枯燥,但是会时时刻刻体现在引擎课程的代码中。真正开课的时候,你将不必为这些琐碎的知识点而蛋疼菊紧。