【计算机图形学-数学基础】【第一章】笛卡尔坐标系
本章内容主要参考《3D数学基础_图形和游戏开发(第2版)》第1章,博主零基础,出于兴趣边看边学,写文章仅作学习分享和记录,如有问题欢迎讨论~
3D数学,即以数学方式精确测量三维空间中的位置、距离和角度,使用计算机执行此类计算最终用的框架称为笛卡儿坐标系(Cartesian Coordinate System)
一维数学
在讨论三维的学习之前,先需要理清数字系统和计数问题。
自然数(Natural Number) 通常被称为 计数数字(Counting Number),诞生之初可能与人们的生活相关,例如记录家畜。
随着文明的进化,人们可以坐在一起思考数字,进而想出各种系统,命名了数字,数学由此诞生。
数字排队(Number Line),即数字以规则的间隔进行标记并排队可以更好进行计数工作。
在历史的某些时刻,人们又发明了负数的概念,进而发现了整数(Integer),它们由自然数字和它们的负面对应物组成。
在人们进一步的生产生活中,产生了有理数(Rational Number) 的概念,它们出现在数字排队线上时,是位于整数之间的某个位置。
不久之后,人们注意到在日常生活中似乎出现的一些数字并不能表达为有理数,典型如π,进而产生实数(Real Number) 的概念,它包括有理数和π等数字。
虽然有理数是可数的(也就是说,可以与自然数一一对应),但实数是不可数的。自然数和整数的研究称为离散数学(Discrete Mathematics),而对实
数的研究则称为连续数学(Continuous Mathematics)。
然而,宇宙似乎不仅是离散的,而且是有限的。宇宙似乎不仅是离散的,而且是有限的。现实世界是离散的,计算机也是离散的和有限的,并且更有可能在创造过程中而不是在现实世界中遇到离散性和有限性的结果。
在当前PC技术下,常用的数字类型包括:
- short:16位整数,存储65536个不同的值。
- int:32位整数,存储4294967296个不同的值,可以满足普通开发者需要。
- float:32位的值,存储有理数的子集。
- double:64位的值,存储有理数的子集。
开发人员在虚拟世界中进行计数和测量时,选择哪种数字类型,需要考虑精度、计算速度等因素,早期的浮点硬件比整数硬件慢,但现在很多专用浮点矢量处理器的引入使得浮点运算比整数更快。
计算机图形学第一定律:如果它看起来正确,那就是对的
平面数学
平面数学,也就是二维笛卡尔数学,在生活中有广泛的应用,数学里的直角坐标系,棋盘,平面图等都可以看到二维笛卡尔坐标空间。

(图源网络)
从图中可以看出,二维笛卡尔坐标空间由以下两条信息定义:
- 原点(Origin):坐标系的“中心”。
- 轴(Axis):在两个相反的方向可以无限延伸(两条轴并不是必然垂直,但大多数常见系统都是垂直轴)。
通常来讲,再处理计算机屏幕上的图像时,坐标系的原点在屏幕的左上角,+x指向右侧,+y指向下方。

(图源网络)
无论为x轴和y轴选择了什么方向,总是可以旋转坐标空间,使+x指向右边,+y指向上方。对于屏幕空间坐标示例,则可以想象一下将坐标系倒置并从显示器后面看屏幕。在任何情况下,这些旋转都不会扭曲坐标系的原始形状(即使我们可能会上下颠倒或左右翻转它)。所以,在一个特定的意义上,所有的二维坐标系都是“相等的”。然而,三维不是这种情况。
在二维中,两个数字即可用于指定位置(用两个数字来描述一个点的位置就是它被称为二维或二维空间的原因。在三维或三维空间中,需要使用3个数字),因此,可以使用有序对(x,y)来描述点位。
通过观察笛卡尔坐标轴上的点位,可以发现:
- x坐标表示从该点到y轴的有符号距离,沿着平行于x轴的直线测量。
- y坐标表示从该点到x轴的有符号距离,沿着平行于y轴的直线测量。
通过观察笛卡尔坐标轴上的网格线,可以发现:
- 垂直网格线标记常数x的线(即垂直网格线由所有具有相同x坐标的点组成)
- 水平网格线标记常数y的线(即水平网格线由所有具有相同y坐标的点组成)
三维笛卡尔空间
乍看之下,三维空间只比二维多了一个维度,然而,由于各种原因,三维空间比二维空间更难以让人类可视化和描述。通常情况下,在二维中“易于”解决的问题放在三维环境下就要困难得多,甚至在三维中尚未定义。
在三维中,我们需要3个轴来建立坐标系,分别以x轴,y轴,z轴来表示,一般来说,我们会进行设置以使所有轴相互垂直,即每个轴垂直于其他轴。

(图源网络)
用于在图中布置轴以及将轴分配到物理维度(左、右、上、下、前、后)的惯例并不是非常标准化的。不同的作者和研究领域有不同的惯例。
任何一对轴定义包含两个轴并垂直于第三轴的平面。例如,包含x轴和y轴的平面是xy平面,其垂直于z轴。同样,xz平面垂直于y轴,yz平面垂直于x轴。我们可以将这些平面中的任何一个视为自己的二维笛卡儿坐标空间。
使用3个数字x、y和z指定点,这些数字分别给出yz、xz和xy平面的有符号距离。距离的测量将沿着平行于轴的直线进行。例如,x值就是到yz平面的有符号距离,沿着平行于x轴的直线测量。
前面讨论过,所有二维坐标系在某种意义上都是“相等的”,对于任何两个二维坐标空间A和B,可以旋转坐标空间A,使得+x和+y的指向与它们在坐标
空间B中的指向相同(假设轴是垂直的)。然而,三维坐标系则不同,所有三维坐标空间都不相等,因为某些坐标系对不能相互对齐。有以下两种不同类型的三维坐标空间: 左手(Left-Handed)坐标空间 和 右手(Right-Handed)坐标空间 。如果两个坐标空间具有相同的旋向性(Handedness),则可以旋转它们使得轴对齐;如果两个坐标空间的旋向性相反,那么这就是不可能的。

(图源网络)
左旋和右旋坐标系在“正旋转”的定义上也有所不同。假设在空间中有一条直线,需要围绕这条直线旋转指定的角度。我们将此线称为 旋转轴(Axis of Rotation) 。旋转轴可以任意取向。那么,如何知道旋转方法呢?这就需要确定一个旋转方向是正方向的;另一个旋转方向则是负方向的。
- 左手规则(Left-Hand Rule):将左手摆出一个“竖起大拇指”的位置,拇指指向旋转轴的正值端。此时,围绕旋转轴的正向旋转方向就是手指卷曲的方向。
- 右手规则(Right-Hand Rule):将右手摆出一个“竖起大拇指”的位置,拇指指向旋转轴的正值端。此时,围绕旋转轴的正向旋转方向就是手指卷曲的方向。

(图源网络)
从图中可以看出,在 左手坐标系 中,正向旋转从轴的正端看时是 顺时针(Clockwise) 旋转的;而在 右手坐标系 中,正向旋转是 逆时针(Counterclockwise) 旋转的。
任何左手坐标系都可以转换为右手坐标系,反之亦然。最简单的方法是 交换一个轴的正负端 。请注意,如果翻转两个轴,那么和围绕第三个轴旋转坐标空间180°是一样的,这不会改变坐标空间的旋向性。切换坐标系的旋向性的另一种方法是 交换两个轴 。左手和右手坐标系都是完全有效的,它们之间确实各有不同,但是并不存在哪一个更好的问题。根据它们的背景,不同研究领域的人肯定会偏好其中的一个,在许多情况下,它只是z坐标中是否要添加负号的问题。
不同的情况可以要求不同的约定,因为如果采用正确的约定,某些任务可以更容易。但是,一般来说,只要在设计过程的早期建立惯例并坚持下去,它就不是什么了不起的事(事实上,这种选择很可能是由所使用的引擎或框架引起的,因为现在很少有人从头开始)。
本系列将使用左手坐标轴。+x、y和+z方向分别指向右、上和前。
计算过程中常用的数学方法(具体的计算公式在网上查找相应资料即可):
- 求和表示法(Summation Notation):事物列表总和,求和符号使用希腊字母sigma表示(∑)
- 求积表示法(Product Notation):事物列表乘积,求积符号使用大写字母π表示(∏)
- 区间符号:闭区间(Closed Interval)/包含(Inclusive)区间[a,b],开区间(Open Interval)/包含(Inclusive)区间(a,b),半开(Half-Open)区间[a,b),(a,b],如果某个端点是无穷的(∞),则可以认为该端点是开放的。
- 角度:测量平面中的旋转量,使用希腊字母theta表示(θ)。通常使用度(Degree,°)数来测量角度,一度表示旋转1/360。数学家更喜欢以弧度(Radian,rad)为单位测量角度,当以弧度指定两条线之间的角度时,实际上是测量单位圆(以半径为1的原点为中心的圆)的截取弧的长度,由于360=2πrad,180°=πrad。要将某个角从弧度单位转换为度数单位,则可以乘以180/π≈57.29578;而要将角度从度数转换为弧度,则可以乘以π/180≈0.01745329。
- 三角函数:包括正弦(sine)、余弦(cosine)、割线(secant)、余割(cosecant)、切线(tangent)、余切(cotangent)。
- 三角函数恒等式:与对称性相关的基本恒等式,勾股定理/毕达哥拉斯定理,毕达哥拉斯恒等式,和或差恒等式,等腰三角形恒等式,正弦定理,余弦定理
浙公网安备 33010602011771号