文章目录
1、3D空间中的向量
向量的起点不重要
讨论vector
时可独立于具体的坐标系,即与具体坐标系无关
计算机图形学中的坐标系和数学中的坐标系不太一样:左手坐标系
和右手坐标系
UE4中使用左手坐标系
当某一向量的起始端与坐标原点重合时,称该向量处于标准位置
对于处于标准位置的向量,我们可用向量的终点坐标来描该向量
。用于描述向量的坐标称为分量(component)
注意区分点和向量
四个特殊的3D向量:
- 1、
零向量(zero vecotr)
: - 2、3D空间的
标准基向量
:
长度为1的向量称为单位向量(unit vector)
在3D图形学
中会使用2D、3D和4D向量
。D3DX库
提供了类D3DXVECTOR2
和D3DXVECTOR4
分别用于表示2D和4D向量
维数不同的向量都具有相同的属性,即长度和方向,只是维数不同。此外,向量的数学运算除了cross product外都可以推广至任意维数的向量
,cross product
只在3D空间中有定义
1.1、向量相等
可以直接使用类中的已重载的比较运算符
来进行比较操作。该比较运算符已经处理好了浮点值比较所存在的问题
1.2、计算向量的长度
使用下面这个函数来计算向量的模
FLOAT D3DXVec3Length(CONST D3DXVECTOR3 *pV);
1.3、向量的规范化
向量的规范化(normalizing)
就是使向量的模变为1
使用下面的函数对向量进行规范化
D3DXVECTOR3 *D3DXVec3Normalize(D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV);
在大部分情况下,除非特别声明,一个D3DX数学函数均返回一个指向结果的指针
1.4、向量加法
使用重载后的加法运算符
1.5、向量减法
使用重载后的减法运算符
1.6、数乘
使用重载后的数乘运算符
1.7、点积
点积(dot product)
就是向量的对应分量相乘后相加,也可以表示为两个向量的模和夹角余弦值的乘积
正交(orthogonal)
,垂直(perpendicular)
1.8、叉积
两个向量叉积(cross product)
的结果还是一个向量
叉积不具备交换性;交换后,结果反向。
对于向量的叉积运算,使用什么坐标系,就用哪一个手来判断结果向量的方向
2、矩阵
有时一个矩阵仅包含单行或单列。这样的矩阵称为行向量或列向量
2.1、矩阵相等、矩阵数乘和矩阵加法
如你所想
2.2、矩阵乘法
矩阵乘法
是矩阵在3D图形学中最重要的运算。借助矩阵乘法,我们能够对向量实施变换
,也可将几个变换进行组合
为了计算矩阵乘积AB,矩阵A的列数必须等于矩阵B的行数
矩阵乘法一般不具有交换性
2.3、单位矩阵
单位矩阵(Identity Matrix)
的特点是除了主对角线上元素为1外,其余元素均为0,而且是方阵(square matrix)
单位矩阵对于标量可认为是矩阵中的1
2.4、逆矩阵
逆矩阵(inverse matrix)
:
- 1、只有方阵才可能有逆矩阵
- 2、并非所有的方阵都有逆矩阵
- 3、一个矩阵与其逆矩阵的乘积为单位阵。当一个矩阵与其单位阵相乘时,可交换相乘次序
逆矩阵在求矩阵方程中的其他矩阵时非常有用
( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)−1=B−1A−1,该性质的前提时,矩阵A和B均可逆,且均为维数相同的方阵
2.5、矩阵的转置
矩阵的转置(transpose)
可通过交换矩阵的行和列来实现
2.6、D3DX矩阵
编写Direct3D应用程序时,我们通常只使用4x4的矩阵
和1x4的行向量
:
- 1、
向量-矩阵
乘法 - 2、
矩阵-矩阵
乘法:矩阵乘法不具有交换性
对于矩阵,可使用括号运算符(parenthesis operator)
来访问矩阵中的每一个元素,索引从零开始
,使用圆括号
//基础矩阵
typedef struct D3DMATRIX{
union {
struct {
float 11, 12, 13, 14;
float 21, 22, 23, 24;
float 31, 32, 33, 34;
float 41, 42, 43, 44;
};
float m[4][4];
};
} D3DMATRIX;
关于Union的用法已忘记
单位矩阵、取转置以及求逆
都有相应的Direct3D函数来实现
3、基本变换
在3D图形学中,用向量-矩阵乘法
来实现各种变换
使用Direct3D编程时,我们使用4x4的矩阵
表示一个变换
我们之所以使用4x4矩阵是因为这种特定维数的矩阵有能力表征我们所需要的所有变换
3x3矩阵无法描述平移(translation)
、透视投影(perspective
)以及反射(reflection,对称变换或镜像变换)
为了使向量-矩阵乘积有意义,我们必须将3D的点或向量扩展为4D行向量
,因为1x3的行向量和一个4x4的矩阵是无法定义乘法运算的
为了保证点的平移变换能够正确进行
,在将点
放入1x4的行向量时,我们将w分量设为1;为了防止对向量进行平移变换
,在我们将向量
放入1x4的行向量时,将w分量置为0
扩展后的4D向量称为齐次(homogenous)向量
如果经过变换后的向量的w分量不为0也不为1,则称该向量处于齐次空间(homogenous space)中
,以区别于3D空间
将处于齐次空间中的向量映射回3D空间
的方法是:用w分量去除该齐次向量的每一个分量
进行3D图形编程时,如果涉及到透视投影,则经常需要将向量由齐次空间映射到3D空间p20
3.1、平移矩阵
Translation matrix
要想对点 ( x , y , z , 1 ) \begin{pmatrix} x, & y, & z, & 1 \end{pmatrix} (x,y,z,1)分别沿坐标轴平移 p x 、 p y 、 p z p_x、p_y、p_z px、py、pz个单位,则只需要将该向量与下面的平移矩阵
相乘即可(p为平移向量
):
T ( p ) = [ 1 0 0 0 0 1 0 0 0 0 1 0 p x p y p z 1 ] T(p)=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ p_x & p_y & p_z & 1 \\ \end{bmatrix} T(p)=⎣⎢⎢⎡100px010py