坐标系简介
在渲染的过程中,坐标系扮演着一个很重要的角色。我记得我们在中学学几何时,第一课就是教授的坐标系的知识。我们在这里复习一下这些坐标系的知识以方便我们进一步学习矩阵相关的内容。
在之前的部分(http://blog.csdn.net/woshimairoude/article/details/72792901)我们了解到【点】和【向量】都是用三个实数构成的一个组来表示的。但这些数字到底表达的是个什么意思呢?其实这些数字表示的是沿着一条线上的一个点离另一个点的距离。举个例子,我们画一条线,然后在这条线的中间做上一个标记。通常我们会把这个标记叫做【原点(origin)】。这个点就是我们的参考点,其他点的距离都是相对于这个点得出的。如果这个点在原点的右边,那么该点的距离就是正数,反之,则为负数。
我们假设这条线是无限延伸的。因此,理论上这条线上两个点之间的距离可以是无穷大的。不过,理论归理论,在电脑里面我们能够表示的数的最大值是有限的。幸运的是,电脑里能够表示的最大数通常都是非常非常大的,基本能够满足我们构建复杂3D场景的需求。现在让我们先不去管这个电脑能够表示的最大数不是无穷大对我们造成的影响。
现在我们有一条线以及一个原点,让我们再在这条线的原点两边每隔相同的距离做一个标记——没错,我们将这条线变成了一把带刻度的尺子。我们可以用这把尺子量出任意一个点离远点的距离。现在让我们采用一种更正式的叫法,我们把这个距离叫做【坐标】。在CG以及数学领域,这把尺子通常被我们称作【坐标轴】。
如果这个点不在坐标轴上,我们如何确定它的坐标呢?
我们可以画一条通过这个点,并且与坐标轴垂直的线来确定这个点在这条坐标轴上的坐标,坐标的值即为这条垂线和坐标轴交点离该坐标轴原点的距离。
到此为止我们已经学会了如何定义一个点在一个坐标轴上的坐标。
维度和笛卡尔坐标系(Dimensions and cartesian coordinate system)
我们现在给上面提到的那把水平放置的尺子一个特别的名字——【X轴(x-axis)】。同时,我们放上另一把与X轴垂直的尺子,且这把尺子经过x轴的原点,并把它叫做【Y轴(y-axis)】。对于任意一个点,我们可以通过上文介绍的画一条与坐标轴垂直的线的方式定义它的x坐标和y坐标。现在,我们可以通过两个坐标构成的有序组来表示任意的一个点了。我们放置了两把尺子,这两把尺子占据了一个平面,在这个平面里的任何一个点都可以用唯一的两个数构成的一个有序组来表示。 因此,通过放置两个轴,我们定义了一个二维的空间,这个空间通常叫做【面(plane)】。
假设我们在一张纸上面画上若干个点。这张纸占据了一个二维的空间,也就是一个面。我们可以在这张纸上再画两个轴,一个x轴,一个y轴。如果我们用这个x轴和y轴来定义我们所画的所有这些点,那么这两个轴就定义了一个【坐标系】。如果这两个轴恰好互相垂直,我们称这个坐标系为【笛卡尔坐标系】。
我们通常使用一种简化的叫做【有序对】的记号来记录我们的点。有序对通常先写x轴坐标,然后写y轴坐标,中间写一个逗号。比如(1,3)表示这个点的x轴坐标是1,y轴坐标是3。
到目前为止,我们已经学会了如何用笛卡尔坐标系的方式来定义点并且如何表示这些点。值得注意的是,在一个笛卡尔坐标系中的点的定义是唯一的。也就是说在同一个笛卡尔坐标系中的同一个点,不会同时拥有多个不同表示。不过,我们同时还必须意识到,我们可以想定义多少个坐标系就定义多少个坐标系。
事实上,我们可以定义无穷多个坐标系。为了简单说明,现假设我们只在同一张纸上定义了两个笛卡尔坐标系。
如上图,在这张纸上,我们画上一个点p。同样的一个点p在两个不同的坐标系里面有不同的坐标。在上图中,p在A坐标系的坐标是(-1,3),在坐标系B中的坐标是(2,4)。
这就产生了一个问题,我们如何通过一个点在一个坐标系中的位置计算出同样的一个点在另一个坐标系中的位置?在CG领域里面,这种坐标转换是一种非常重要的操作。我们将会很快学到这种梦幻般的操作是如何进行的。
现在,我们还是用上面的那张图来简要的说明这个问题。通过上面那张图,我们注意到一个事实:p在A坐标系中的坐标(-1,3)加上(3,1)就得到p点在B坐标系中的坐标(2,4)。而(3,1)刚好是坐标系A的原点相对于坐标系B的原点的坐标。相反的,我们将p在B中的坐标(2,4)加上(-3,-1)就得到p在A坐标系中的坐标(-1,3),而(-3,-1)刚还是坐标系B的原点相对于坐标系A的原点的坐标。这一切都是巧合吗?不,我相信我所看到的规律~
在坐标系里面移动一个点是很普遍的操作。通常我们把这种操作叫做【平移变换】,这也是我们能够对一个点做的做基础的操作。对于其他的尚未提到的线性变换也是能够对点坐标使用的。通过用一个实数与点坐标相乘(结果就是将这个实数分别与x坐标和y坐标相乘的到一个新的坐标),则我们对点进行了一次【缩放变换】。
比如点p(1.5,1.5),经过缩放变换之后,变成了点p(3,3),这就是与实数2相乘之后的结果。缩放的结果就是将点沿着改点与原点的连线移动已定的距离。ok,点到为止,我们在之后会有章节来更详细的讨论这些个线性变换,稍安勿躁。
The Third Dimension(第三维)
3D坐标系是对2D坐标系的一种扩展。我们会在2D坐标系的基础上再添加一条与两个轴正交(也就是同时与另外两个轴垂直)的轴。这条新添加的轴被我们亲切的叫为【z轴(z-axis)】。x轴指向右边,y轴指向上边,z轴从屏幕里指向我们。当然上面的这种定义并不是唯一的,我们会在下面说明其他的定义方式。在本系列教程中,我们将使用最开始提到的那种定义方式。在几何学里面,上面定义的那种3D坐标系也被称为【欧几里得空间】(嗯…霸气的名字)。
我们用图的方式来把本章中本部分介绍的坐标系的定义精确的以及正式的给出来。在线性代数里面,这个坐标系中的三个轴被称为这个坐标系的【基(basis)】。一个基是由若干【线性无关(linear independent)】的向量组成的。在这个基所定义的空间中的任何一个向量,都可以用构成这个基的若干向量的线性组合得到。那什么是【线性无关】呢?线性无关的向量的意思就是:这些线性无关的向量中的一个向量,都不能用另外的向量用线性组合的方式算出来。改变空间的基(或者也叫做【空间变换】),是计算机渲染图像的一个非常重要的操作。
左手坐标系与右手坐标系(Left-Handed vs Right_Handed Coordinate Systems
真实糟糕透了!我们不得不承认地球上有两种人:左撇子和右撇子。可能你觉得这并不是什么大不了的事,但事实上这对我们的CG领域的影响还是蛮大的。我们用下面一幅图来说明这种情况:
当我们的【上向量(up vector)】和【前向量(forward vector)】都指向相同的方向,此时我们的【右向量(right vector)】到底该指向哪边呢?左撇子同学伸出他的左手,用食指对准前向量,用大拇指指向上向量,如上图中的A图所示。他看了看自己的中指,于是得出结论,右向量应该是中指指向的方向,也就是自己的右边。于此同时右撇子同学伸出他的右手,如上图中的B图,食指和大拇指指向与左撇子同学相同的方向,但是右撇子同学看了看自己的中指,指向的是左边,于是右撇子同学坚持认为右向量应该指向自己的左边。为了消除左撇子或是右撇子歧视,我们同时保留了这两种方式,并且把这两种截然不同的坐标系分别叫做左手坐标系(左撇子同学的方式)以及右手坐标系(右撇子同学的方式)。 如果我们将左手坐标系的右向量和右手坐标系的右向量统一指向左边,会发现左手坐标系的前向量与右手坐标系的前向量刚好相反。
总之,这两种坐标系都是经常用到的,那么我们怎么快速的确定到底是左手坐标系还是右手坐标系呢?始终记住:中指始终指向的是右向量(x轴的方向)。我们先将中指对准x轴的方向,如果左手的大拇指和食指的方向和图中所示的方向一致则是左手坐标系,反之,则为右手坐标系。
哦,对了。左手坐标系和右手坐标系在计算多边形面的朝向的时候也扮演着重要的角色。我们会在后面详细的介绍原因,这里只是顺带提一嘴。
右,上,前向量
笛卡尔坐标系只是由三个相互垂直的单位向量定义。这种坐标系的定义中并不包括这三个轴分别代表什么意思的信息。开发者决定着这三个轴所表达的意思。所以我们必须明白在右手坐标系和左手坐标系里面,这三个轴按照CG的习俗,应该分别表示什么意思。
我们通常所说的上向量到底是指y轴还是z轴?让我们假设x轴是右向量,如下图:
很明显,这是一个右手坐标系。我们要做的只是将一个坐标系标上x,y,z。命名风俗(右,上,前向量)与坐标轴是左手坐标系还是右手坐标系没有直接关系。理解这一点很重要!由于很多系统里面,z轴通常意味着上向量,大家就会以为所有系统里面都采用这种风俗,然而事实上并不是这样。
对于一个坐标系来说,“右向量”的方向直接关系着坐标系是左手坐标系还是右手坐标系,这些轴代表什么意思并不影响坐标系是左手坐标系亦或是右手坐标系。
当我们在使用一个3D系统时,确定他使用的是右手坐标系还是左手坐标系至关重要。到目前为止,CG领域大多使用右手坐标系,x轴指向右向量,y轴指向上向量,z轴指向前向量。我们常用的Maya和OpenGL使用的是右手坐标系,DirectX,pbrt以及PRMan使用的是左手坐标系。我们之前说过,左手坐标系和右手坐标系的z轴是相反的,如果我们从Maya里面到处模型道DirectX中,需要完成z坐标的转换。左右手坐标系也影响向量的旋转以及如何计算两个向量的叉积。我们将在后面的章节详细讨论这些内容,再次请略过。
请注意,在本系列文章中,我们将始终使用右手坐标系。因为我们将会使用Maya,而且着似乎也将成为工业标准~
世界坐标系系统
我们已经学到一个向量和点的坐标与笛卡尔坐标系的原点的位置有直接的关系。同时我们也知道,我们能够创建无数多个笛卡尔坐标系。然而,在一个3D应用程序里面,每一种不同的坐标系都是参照一个叫做【世界坐标系】的坐标系定义的。世界坐标系定义了一个终极的原点,其他的所有坐标系都是以此原点为参照。在渲染的过程中,世界坐标系扮演着重要的角色,他将处于不同坐标系中的物体之间建立了联系。这些物体包括3D模型,摄像机等。我们稍后会详细介绍这中奇妙的联系。
我们需要记住的
这篇文章中提到的内容其实并不需要都记住,也没有必要。重要的是对这些几何知识以及CG中的术语留下印象。比如坐标,轴,笛卡尔坐标系。我们也介绍了一些线性变换的知识。最重要的内容是记住点的坐标相关的内容,以及我们可以定义很多的坐标系且每个点在一个坐标系中的坐标是唯一,足矣。最后,我们需要学会如何快速的判断一个坐标系是左手坐标系还是右手坐标系。且千万记住左右手坐标系和上,下,右向量真的没有啥关系~
下一篇内容:点和向量的数学计算