📢前言
本文内容基于清华大学出版社的《3D数学基础:图形和游戏开发》(第二版),博主仅做文章内容梳理、补充工作。
书中涉及的一些数学知识对于大学生来说过于简单的在博客中不会记录,本文适合有一定大学数学基础的人阅读,如有需要可购买原书阅读。
这是该系列的第一篇文章,后续会持续更新。
一、笛卡尔坐标系
所谓“3D数学”就是以数学方式精确地测量在三维空间中地位置、距离和角度。
一维数学
“死羊问题”->自然数(Natural Number):为了跟踪记录死羊->整数(Integer):有人可以卖掉他们并不曾拥有的羊(负数概念)->有理数(Rational Number):贫困的人不足以购买整只死羊->实数(Real Number):圆周率
->自然数和整数的研究称为离散数学(Discrete Mathematics)
->对实数的研究则称为连续数学(Continuous Mathematics)
计算机图形学第一定律:如果它看起来正确,那就是对的。
二维笛卡尔空间
二维笛卡尔数学,也就是平面数学
任意二维坐标空间由以下两条信息定义:
坐标系的“中心”,称为原点(Origin)
每个二维笛卡尔坐标空间都有两条直线通过原点,每条线都被称为轴(Axis)
使用有序对诸如(2,4)来指定二维中的位置——笛卡尔坐标(Cartesian Coordinates)
三维笛卡尔空间
在三维中,使用3个数字x、y和z指定点,这些数字分别给出yz、xz和xy平面的有符号距离。
所有二维坐标系在某种意义上都是“相等的”——所有三维坐标系都不相等,因为某些坐标系对不能相互对齐->有以下两种类型的三维坐标空间:
左手坐标空间(Left-Handed)和右手坐标空间(Right-Handed)
由于左手系和右手系的原因牵扯出了两系之中的旋转问题->如何判定旋转的正负方向?
左、右手法则分别运用于左、右手坐标系->拇指指向轴的正值端,即在左手坐标系中,正向旋转从轴的正端看时是顺时针(Clockwise);而在右手坐标系中,正向旋转是逆时针(Counterclockwise)
二、矢量
矢量(Vector)是用来构建2D和3D数学的正式数学单位。单词Vector有两个不同但相关的含义(即矢量和向量)——在线性代数中,Vector被称为“向量”,而在几何中,Vector被称为“矢量”。
向量的维度(Dimension)表示包含的向量的数量。向量可以是任何正维度的,包含一个。实际上,标量也可以被认为是一维向量。本书主要对二维、三维和四维向量感兴趣。
PS:四维向量的第四个值是w
矢量点积(Dot Product),也称为内积(Inner Product):
两个矢量的点积是相应分量的乘积之和,得到的是一个标量:
矢量叉积(Cross Product)
叉积与点积具有相同的运算符优先级,当点积与叉积一起使用时,叉积优先。
-> 等于两条边a和b形成的平行四边形的面积
三、多个坐标空间
使用多个坐标空间的原因 ->某些信息仅在特定参考帧的环境中是已知的
世界空间
世界坐标系(World Coordinate System)是一个特殊的坐标系,它为所有其他要指定的坐标系建立了一个“全局”参考系。
世界坐标空间也称为全局(Global)坐标空间或通用(Universal)坐标空间
对象空间
对象空间(Object Space)是与特定对象关联的坐标空间,每个对象都有自己独立的对象空间。
在图形的上下文中,对象空间也称为模型(Model)空间或体(Body)空间。
相机空间
对象空间的一个特别重要的示例是相机空间(Camera Space),其是用于渲染的视点相关联的对象空间
在相机空间中,相机位于原点,+x指向右侧,+z指向前方,+y指向上方,这些是传统的左手坐标系统约定
请仔细注意相机空间(三维空间)与屏幕空间(二维空间)之间的差异——从相机空间坐标到屏幕空间坐标的映射涉及的操作称为投影(Projection)
直立空间
在某种意义上,对象的直立空间是世界空间与其对象空间之间的“中间过渡”
因为,直立空间的轴线与世界空间的轴线平行,直立空间的原点与对象空间的原点重合。
通过平移可实现在世界空间和直立空间之间的转变;通过旋转可以实现在直立空间和对象空间之间的转换。
双重视角
一个问题:“我们必须首先旋转,然后再平移吗?” “是的”
如果我们首先旋转对象,那么旋转的中心就是原点;如果在平移之后旋转,那么旋转将发生在一个不是原点的点上——围绕原点的旋转是线性变换,而围绕其他任何点的旋转是仿射(Affine)变换。
如果我们需要将模型顶点变换为相机空间,怎么做?
我们可以通过移动整个世界(包括相机),从而把相机移动到原点
从世界空间到相机空间的变换通常在顶点着色器(Vertex Shader)中完成。就图形管道而言,相机空间并不是“终点”,从相机空间开始,顶点被转换到裁剪空间(Clip Space),最后投影到屏幕空间(Screen Space)。
双重视角——在绝对视角下来看,用来描述点的坐标空间保持不变,这就是主动变换(Active Transformation)
也可以将同一过程视为被动变换(Passive Transformation),在被动范式中,我们想象当我们移动用于描述这些点的坐标空间时,这些点是静止的。
基矢量:v = xp + yq + zr,将三维矢量表示为基矢量的线性组合(Linear Combination)
大多数时候,p=[1,0,0]、q=[0,1,0]、r=[0,0,1](可以这样简单的理解,扣定义就不行了)
基矢量的坐标是根据参考帧测量的,该参考帧与基所在的坐标空间不同。因此,基矢量与坐标空间变换密切相关。
可以表示为基矢量的线性组合的矢量集称为基矢量的跨度(Span)
用于描述基所跨域的空间中的维度的术语是基的秩(Rank),显然,如果有n个基矢量,我们希望的最好结果是满秩(Full Rank),这意味着跨度是一个n维空间。
矢量相对于给定基的数值坐标是该矢量作为基矢量的线性组合的拓展中的系数
一组相互垂直的基矢量称为正交基(Orthogonal Basis)