简介:
本书是关于3D数学、三维空间的几何和代数的入门教材。它旨在告诉你如何使用数学描述三维中的物体及其位置、方向和轨迹。这不是一本关于计算机图形学、模拟,甚至计算几何的书,但是,如果读者打算研究这些科目,那么肯定需要这里的信息。
这是一本适宜视频游戏程序开发人员阅读的图书。虽然本书假定大多数读者都是为了编写视频游戏而学习,但我们期待更广泛的受众,并且在设计这本书的体例时也考虑到了不同的受众。如果你是程序开发人员或有兴趣学习如何制作视频游戏,欢迎加入! 如果你没有达到这些标准,那么你在这里仍然可以收获很多。
我们已经尽一切努力使本书对设计师和技术美工也很有用。虽然本书中有一些代码片段,但即使对于非程序开发人员来说,它们也很容易阅读(希望如此)。最重要的是,虽然你需要先理解相关的概念才能理解代码,但是反过来并不成立。我们使用代码示例来说明如何在计算机上实现创意,而不是解释这些创意本身。
第一章:笛卡尔坐标系
1.1 一维数学
自然数 Natural Number : 非负整数的集合,其特点是有序性和无限性
因为日常生活中对数字的需要,于是先产生自然数,这里提到是"死羊的个数"。
整数 Integer : 整数是由自然数字和它们的负面对应物组成。
因为生产生活的发展,产生经济活动,逐步开始有贫穷、负债、借贷等需要,于是在自然数的基础上拓展到整数。
**有理数 Rational Number :整数和分数 **
再在整数的基础上拓展,如要买半只羊,拓展到分数领域,便将数字范围由整数拓展到有理数。
实数 Real Number :包括有理数和无理数
有时候也会遇到无法准确表示实际意义的数值,典型的如Π(圆周率)。
我们需要知道是,有理数是可数的(也就是说,可以与自然数一一对应),但实数是不可数的。
对自然数和整数的研究称之为离散数学 Discrete Mathematics
对实数的研究称之为 连续数学 Continuous Mathematics
现实世界却是离散的。这对三维计算机生成的虚拟现实的设计者有何影响?就其本质而言,计算机是离散的和有限的,并且更有可能在创造过程中而不是在现实世界中遇到离散性和有限性的结果。
这些数字可以是short、int、float 和double类型的。
计算机中离散数学所使用的变量类型:
- short:short是一个16位(bit)的整数,可以存储65536个不同的值
- int: int是一个32位的整数,它最多可存储4,294,967,296个不同的值
- float: float 也是一个32位的值,它可以存储有理数的子集(略少于4294967296,在这里细节并不重要)。
- double: double 和 float类似,但它使用64位而不是32位.
计算机图形学第一定律:
如果它看起来正确,那就是对的。
1.2 二维笛卡尔空间(平面空间)
- 每个二维笛卡尔坐标空间都有一个特殊位置,称之为原点,Origin,它是坐标系的"中心",坐标为(0,0)
- 每个二维笛卡儿坐标空间都有两条直线通过原点。每条线都被称为轴(Axis),并且可以在两个相反的方向上无限延伸。
- 两个轴彼此垂直(实际上,它们并不是必然要垂直的,但我们看到的大多数常见系统都将具有垂直轴)。
在二维坐标系中描述坐标位置:
在二维中,两个数字即可用于指定位置(事实上,用两个数字来描述一个点的位置就是它被称为二维或二维空间的原因。在三维或三维空间中,需要使用3个数字)。在(2,4)这个示例中,第一个坐标(也就是2)被称为x坐标;第二个坐标(也就是4)被称为y坐标。
请注意,垂直网格线由所有具有相同x坐标的点组成,换句话说,垂直网格线(实际上是任何垂直线)标记常数x的线。同样地,水平网格线标记常数y的线,也就是说,该行上的所有点都具有相同的y坐标。当讨论极坐标空间时,需要稍微回顾一下这个知识点。
1.3 三维笛卡尔空间
1.3.1 新增维度和轴
在三维中,我们需要3个轴来建立坐标系。前两个轴分别称为x轴和y轴,就像在二维中一样(当然,说它们与二维轴相同是不准确的,稍后会有更详细的解释)。我们将第三个轴(可预测地)称为z轴。一般来说,我们会进行设置以使所有轴相互垂直,即每个轴垂直于其他轴。
在三维中,任何一对轴定义包含两个轴并垂直于第三轴的平面。同样,xz平面垂直于y轴,yz平面垂直于x轴。我们可以将这些平面中的任何一个视为自己的二维笛卡儿坐标空间。
1.3.2 在三维空间中指定位置
在三维中,使用3个数字x、y和z指定点,这些数字分别给出yz、xz和xy平面的有符号距离。
距离的测量将沿着平行于轴的直线进行。例如,x值就是到yz平面的有符号距离,沿着平行于x轴的直线测量。
1.3.3左手和右手坐标空间
所有二维坐标系在某种意义上都是"相等的",对于任何两个二维坐标空间A和B,可以旋转坐标空间A,使得+x和+y的指向与它们在坐标空间B中的指向相同(假设轴是垂直的)。
三维坐标系有两周坐标类型:
左手(Left-Handed)坐标空间和右手(Right-Handed)坐标空间。
如果两个坐标空间具有相同的旋向性(Handedness),则可以旋转它们使得轴对齐;如果两个坐标空间的旋向性相反,那么这就是不可能的。
这是左手三维空间坐标系
这是右手空间坐标系
左旋和右旋坐标系在"正旋转"的定义上也有所不同。
假设在空间中有一条直线,需要围绕这条直线旋转指定的角度,将此直线称之为旋转轴。首先我们必须定义轴"指向"的方向,基于此来指定旋转的正方向。
在左手坐标系中,正向旋转从轴的正端看时是顺时针(Clockwise)旋转的;
而在右手坐标系中,正向旋转是逆时针(Counterclockwise)旋转的。
1.4 一些零散的知识
求和表示法(Summation Notation)
要获取一系列数值的乘积,可用类似的表示法:
区间符号
\[[a,b] <==> a \le x \le b \]
\[(a,b) <==> a < x <b \]
角度、度数和弧度
度 Degree : 360度 为一周
弧度 Radian: 测量度数所对应的那段弧的长度,
三角函数
使用单位圆来定义三角函数:
在二维中,如果以指向+x的单位线条开始,然后逆时针旋转该线条角度0,则可以在标准位置(Standard Position)绘制该角度(如果该角度为负,则沿另一个方向旋转线条)。
这样旋转的线条端点的(x,y)坐标具有特殊属性,并且在数学上非常重要,因此,它们被赋予了特殊函数,称为角度的余弦(cosine)和正弦(sine),定义如下:
在正弦和余弦函数基础上可以继续定义割线、余割、切线和余切
\[割线:sec \theta = \frac{1}{cos\theta}, 切线 :tan\theta = \frac{sin\theta}{cos\theta},余割:csc\theta = \frac{1}{sin\theta},余切:cot\theta = \frac{1}{tan\theta}=\frac{cos\theta}{sin\theta} \]
比关系,谨记勾股定理:勾3 股4 弦5
\[余弦函数:cos\theta = \frac{x}{r} ,正弦函数:sin\theta = \frac{y}{r},正切函数:tan\theta = \frac{y}{x} \]
\[割线函数:sec\theta = \frac{r}{x},余割函数:csc\theta = \frac{r}{y},余切函数:cot\theta = \frac{y}{x} \]
三角函数之间的恒等式:
\[sin(-\theta) = -sin\theta ,cos(-\theta) = cos\theta ,tan(-\theta) = - tan\theta \]
\[sin(\frac{\pi}{2} - \theta) = cos\theta, cos(\frac{\pi}{2} - \theta) = sin\theta,tan(\frac{\pi}{2} - \theta) = cot\theta, \]
勾股定理:(毕达哥拉斯定理)
\[sin^2\theta + cos^2 \theta = 1, 1 + tan^2 \theta = sec^2 \theta, 1+cot^2 \theta = csc^2\theta \]
倍角公式:
正弦定理和余弦定理: