基础概念
矩阵
一个m*n矩阵 是 一个m行、n列的矩形数组。
如果一个矩阵只包含单行 或 单列, 这样的矩阵 为 行矩阵或 列矩阵,又叫行向量或列向量
矩阵的乘法:
点
空间中的点,我们通常用一个 行向量表示: p = [x, y, z]
坐标系
用笛卡尔坐标系表示3D空间,我们按习惯可分为:左手坐标系 和 右手坐标系。如图:
左手坐标系Z轴正方向向里,右手坐标系Z轴正方向向外。在DirectX3D中我们使用左手坐标系。
平移
在3D空间中,我们经常需要将一个点 平移到另一个位置。假设空间中的一点P,其用行向量表示为;将其向 x方向平移 dx,向y方向平移 dy,向z方向平移 dz后,得到的一点。
但是在数学计算或游戏编程中,我们都希望可以运用矩阵的乘法来表示点的平移。我们希望有一个公式: , 其中为一个矩阵
为了方便这种矩阵运行,我们引入齐次坐标,即将3D空间中的点P表示为, 其中w为齐次化坐标。 在游戏编程中,我们都用1表示w。这样我们就能得到一个4*4 的平移矩阵:
其中:
这样通过3D空间中的 任意一点 都可以通过 与平移矩阵向乘, 进行平移。
旋转
平移能够通过矩阵乘法来表示,同样,我们也希望3D空间中点的旋转也能用矩阵乘法来表示。
在理解旋转时,我们必须向记住几个高中学习的三角函数公式:
首先强调一个规则:在左手坐标系中,旋转角的正方向为顺时针方向;在右手坐标系中,旋转角的正方向为逆时针方向。
旋转我们可分为绕x轴、y轴、z轴旋转。
以绕z轴旋转为例:当绕z旋转时,其z坐标是不会发生变化的。x坐标和y坐标发生旋转。
由图可得,旋转后的x和y坐标分别可表示为:
其中r为点到坐标原点的距离。很容易化简可得:
按照矩阵乘法,我们
、
其中绕Z轴旋转矩阵 为:
同样的方法,我们可以求得绕x轴 和 绕y轴 的旋转矩阵分别为:
这样,我们就可以通过矩阵的乘法,实现点的任意旋转。
缩放
想要对相对于原点缩放某个点,只需要将x,y,z三个分量分别乘以对应的缩放因子:sx,sy,sz。
同样我们可以用矩阵乘法表示:
其中缩放矩阵为:
总结
有了以上平移、旋转、缩放矩阵后,我们就可以通过矩阵乘法求得点P任意变化后坐标: