零基础学图形学(3) 几何知识——坐标系统
1. 坐标系统的介绍
在图像管道中坐标系统扮演很重要的角色。它们并不复杂,当我们在学校学习几何知识的时候坐标系统是我们首先学习的知识。但是,通过学习一点它们的知识可以更好地理解矩阵的知识。
在前面的章节中我们提到点和向量是用三个有理数表示的。但是那些数表示什么意思呢?每个数表示一段带符号的从原点到该点的距离(signed distance)。比如,画一条直线,我们在它中间的位置做上一个标记。我们称这个标记为原点(origin)。这个标记变成我们点的引用位置:我们会用从这点的距离测量其它的任何点。如果点在原点的右边,我们称这段距离为大于零的正数,另一方面,如果这个点在原点的左边,它的值将会为负的。
我们假定从原点出发的点在两个方向上都可以无线延长。因此,理论上来说,那条线上的两个点之间的距离可以无线延伸。但是,这里有个问题,在计算机的世界中,你只能使用有限的数字来表示数(它取决于我们使用多少位来编码数字)。非常幸运的是,这个最大值通常已经足够建立我们需要渲染的3D世界。所有我们需要处理的CG数据都会包括其中,那也就是说,我们不用太担心计算限制。
现在我们有一条线和一个原点,我们增加了其它额外的标记表示内部的单位长度,两个方向上都是类似的表示,因此我们把线段变成一把尺子。这个尺子建立之后,我们可以使用它来测量坐标系中点。在计算机图形学和数学上,尺子也叫做轴(axis)。
如果我们感兴趣的点不在坐标轴上我们仍然可以使用投射的方式表示它们(这样假定尺子是水平的,通常的我们用一个相互垂直的线段)。从原点到和竖直线香蕉的线段的距离,我们刚刚学习定义了坐标轴上的点。
如下图所示:
(2)尺寸和笛卡尔坐标系
我们称水平的尺寸为x轴(x-axis).我们可以画另外一条经过原点的垂直于x轴的直线,我们称呼它为y轴(y-axis)。对于任意点,我们可以通过画两条相互垂直的线来决定x轴和y轴的坐标,这个坐标就是两个轴分别到原点的距离(在上面已经描述过)。我们现在可以找到两个数字,或者两个坐标,对于任意点,一个是x轴,一个是y轴。因此,通过两个轴的防止,我们已经定义了一个二维的坐标平面。
比如,在一张纸上画一系列的点,这张纸占据着一个二维的坐标系,比如平面。我们可以画两个坐标:每一个对应一个维度。如果我们使用x轴和y轴去测量纸上的每个点,这两个轴就会定义了坐标。如果这两个标尺的轴是垂直的,那么它们就定义了一个笛卡尔坐标系。
记住我们使用一种准确的叫做序列对(ordered pair)去写坐标上的点。一个坐标对仅仅只是两个被逗号分开的数字。对于笛卡尔坐标系来说,通常是先写x轴的坐标,再写y轴的坐标。比如,我们会写(2.5, 2.25),那么这个点表示x轴的坐标值为2.5,y轴的坐标值为2.25,见下图
不要让这个吓到你,记住我们可以始终使用这个序列对表示带符号的距离,向右数2.5个距离,向上数2.25个距离。在下面的例子中我们会用到很多的这种方式去表达。
现在,我们已经知道如何去建立一个二维的笛卡尔坐标系,和定义坐标系中的一个点。这意味着在一个系统中,相同的点不会有两种表达方式。但是需要注意的是我们可以自由地选择想要表达的坐标系统。
实际上,在一个平面上我们可以定义无所个类似的坐标系统。假设我们在一张纸上画了两个笛卡尔坐标系,在这张纸上我们放置了一个点。那么这个坐标值会根据坐标系统的变化二产生变动。比如在下图中,点P有一个坐标值(-1, 3) 在坐标系统A中,但是在坐标系统B中,P点的坐标值是(2, 4).但是这是同一个点,这个点在在我们开始画它的时候就在同一个地方。
因此如果你知道A坐标系统在P的位置,那么你怎么在B坐标系统中找到相同的位置呢?这里面包含了一个很重要的的操作。我们不久之后将要学习它们,如果将坐标系中的一点过度到一个坐标系中(可以看点和向量变换章节)。
现在让我们考虑上图中的场景,给点增加(3, 1)那么会移动到(2,4)那个地方去。因此将A坐标系的P点增加(3,1)产生坐标系B的P点。反过来会得到从B坐标系得到A坐标系的点。记住(-3, -1)只是(3, 1)的相反的点。这个可以改变点的相反的方向。
一个另外很常见的操作就是将同一个坐标系的点从一个位置移动到另外一个位置。这叫做移动,这是你对点可以进行的最基本操作。记住其它的线性操作都可以应用于点坐标系上。将坐标系中的点乘以一个实数会将这个点放大。如下图所示,如果放大P点的话,则会沿着原点到该点的线段向前移动。
3. 三维坐标
三维坐标系仅仅只是二维坐标系的延伸,我们增加了一个垂直于x轴和y轴的z轴(表示深度)。x轴指向右边,y轴指向上面,z轴指向后面(有时候x轴指向右边的时候也指向屏幕)。也可以用其它的指向形式,但是在我们这个教程中,我们只会使用一种形式。在几何中,3维坐标系统旺旺被称作Euclidean space.
我们使用一个更加正式的坐标定义介绍这节。在线性代数中,三跟轴我们称之为基本坐标轴。一系列独立的线性向量可以表达每个轴上的向量。从一组中的得到的向量可以说是线性独立的,改变基本,或者改变坐标系统,在数学上或者几何管道上很常见。
4. 左手准则和右手准则坐标系统
不幸的是,因为不同的考虑习惯,坐标系统并不是那么简单的。下面这幅图展示一个问题:当向上和向前都是指向相同的时候,右向量可以向左或者向右。
为了区别这两种方式,我们称第一种为左手坐标系统,后面一个为右手坐标系统。这个称呼是被物理学家John Ambrose Fleming创立的,目的是更简单地区分它们的不同。
为什么用手来代替,如果你向上图那样左右手势来表示两个坐标系统,你可以看到你的手势指向右,上和前的向量,左手对应左手坐标系统,右手对应右手坐标系统。但是,在右手坐标系统中,我们可以旋转坐标系统,因此右向量可以直接看到指向右边。当我们那样做的时候,前向量指向我们自己,如下图所示。
记住中指始终表示的是右向量(right),当使用这个来检查坐标系统的时候。你可以旋转你的右手来确定这是一个左坐标系统还是右坐标系统。
左右手坐标系统在计算几何体的表面的法向量方向的时候也有重要的作用。如果朝向是右手坐标系统,那么多边形的顶点如果是逆时针的则被认为是前面,这会在多边形渲染章节中讲到。
5. 右,上,和前向量
笛卡尔坐标系统仅仅只是用三个相互垂直的向量定义,就像数学公式定义的那样,这个坐标系统对于三个轴没有任何的实际意义。开发者决定这些轴具体想要表达的意思。因此很重要的一点就是区别左右手坐标系统和使用字母表示的相应的坐标轴。
向上的是成为z轴还是y轴?我们使用下面图b来表示,以及假定x轴为右向量,如果右手可以和三个轴重合就说明是右手坐标系。正如你说看到,我们所能做的就是确定是左手坐标系还是右手坐标系,然后标记x, y,z轴。x, y, z轴的命名和左右手坐标系没有任何关系,理解它们的区别很难。很多人认为一个向上的坐标轴标记为z轴,而和平时向上的坐标轴标记为y轴不同,就认为它是左手左边系,而另一个是右手坐标系。
定义是左右手坐标系唯一不同的一点就是右向量相对于上向量和前向量的指向,而与轴的表示没有任何关系。
左右手坐标系和使用轴的名称是两个完全不同的东西。
在一个3D渲染的坐标系统中,知道是使用那个常规的坐标系是很重要的。在目前,工业的标准倾向于右手坐标系的系统,其中x指向右边,y向上,z从屏幕指向自己。3D的api比如maya和opengl都是使用右手坐标系,而directX, pbrt和prman使用的是左手坐标系。记住Direct, 和PRMan向上的坐标轴称为y轴,向前的坐标轴称为z轴。这意味着z轴坐标在一个系统上-3的点,在另一个系统上表示3.所以在渲染的时候我们需要对z轴的坐标取反。选择左手或者右手坐标系统有很重要的意义,因为它涉及到旋转和两个向量的叉乘。我们会在下面几节中讲到这个问题。从一个坐标系统转换到另外一个坐标系统是简单且痛苦的一件事情就是将所有的点都乘以一个(1, 1, -1).
现在你只需要知道这个系列的教程使用的是右手坐标系统,和Maya保持兼容性。,同事也是因为它已经变成默认的工业标准(总之我们希望每个人都使用相同的坐标系统)。
6. 世界坐标系统
我们已经学习了点和向量的坐标相对于笛卡尔坐标系中原点的位置,通过定义三个相互垂直的有刻度的向量。我们也解释了我们可以创建很多很多的坐标系统,而且每个坐标系统中相同点的坐标值是不同的。但是,在大部分的3D程序中,每个坐标系统的定义都是相对于一个主的坐标系统,我们称这个坐标系为世界坐标系。它也定义了原点和其它的x, y,z轴。在管道渲染中,世界坐标系可能是所有坐标系中最重要的,这些坐标系包括物体坐标系,本地坐标系,以及相机和屏幕坐标系,我们接下来会讲述这些坐标系。
7. 需要我们记住的东西
我们认识到绝大部分的读者不需要这部分的解释。但是它对于正确理解CG的几何工作是至关重要的。在这章中,重要的名词是坐标,轴,笛卡尔坐标系。我们也介绍了线性操作的概念。需要记住的最重要的概念就是点相对于坐标系统的坐标,可以定义很多的坐标系统,但是一个点在某个坐标系统中只有确定的位置。理解渲染时或者api中你用的坐标系统是左手还是右手坐标系也很重要,很容易将它们和坐标轴的命名相混淆。