3D坐标系中 点 的 平移、旋转和缩放


基础概念

矩阵

一个m*n矩阵 是 一个m行、n列的矩形数组。

如果一个矩阵只包含单行 或 单列, 这样的矩阵 为 行矩阵或 列矩阵,又叫行向量或列向量

矩阵的乘法:

3D坐标系中 点 的 平移、旋转和缩放_第1张图片

空间中的点,我们通常用一个 行向量表示: p = [x, y, z]

坐标系

用笛卡尔坐标系表示3D空间,我们按习惯可分为:左手坐标系 和 右手坐标系。如图:

3D坐标系中 点 的 平移、旋转和缩放_第2张图片

左手坐标系Z轴正方向向里,右手坐标系Z轴正方向向外。在DirectX3D中我们使用左手坐标系。

平移

在3D空间中,我们经常需要将一个点 平移到另一个位置。假设空间中的一点P,其用行向量表示为;将其向 x方向平移 dx,向y方向平移 dy,向z方向平移 dz后,得到的一点

但是在数学计算或游戏编程中,我们都希望可以运用矩阵的乘法来表示点的平移。我们希望有一个公式: , 其中为一个矩阵

为了方便这种矩阵运行,我们引入齐次坐标,即将3D空间中的点P表示为, 其中w为齐次化坐标。 在游戏编程中,我们都用1表示w。这样我们就能得到一个4*4 的平移矩阵:

3D坐标系中 点 的 平移、旋转和缩放_第3张图片

其中:

3D坐标系中 点 的 平移、旋转和缩放_第4张图片

这样通过3D空间中的 任意一点 都可以通过 与平移矩阵向乘, 进行平移。

旋转

             

平移能够通过矩阵乘法来表示,同样,我们也希望3D空间中点的旋转也能用矩阵乘法来表示。

在理解旋转时,我们必须向记住几个高中学习的三角函数公式:

https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D247/sign=3c6147b39325bc312f5d069c69de8de7/71cf3bc79f3df8dcc0941decc711728b47102825.jpg

首先强调一个规则:在左手坐标系中,旋转角的正方向为顺时针方向;在右手坐标系中,旋转角的正方向为逆时针方向。

3D坐标系中 点 的 平移、旋转和缩放_第5张图片

旋转我们可分为绕x轴、y轴、z轴旋转。

       以绕z轴旋转为例:当绕z旋转时,其z坐标是不会发生变化的。x坐标和y坐标发生旋转。

3D坐标系中 点 的 平移、旋转和缩放_第6张图片

由图可得,旋转后的x和y坐标分别可表示为:

其中r为点到坐标原点的距离。很容易化简可得:

按照矩阵乘法,我们

 

其中绕Z轴旋转矩阵 为:

同样的方法,我们可以求得绕x轴 和 绕y轴 的旋转矩阵分别为:

这样,我们就可以通过矩阵的乘法,实现点的任意旋转。

 

缩放

想要对相对于原点缩放某个点,只需要将x,y,z三个分量分别乘以对应的缩放因子:sx,sy,sz。

同样我们可以用矩阵乘法表示:

3D坐标系中 点 的 平移、旋转和缩放_第7张图片

其中缩放矩阵为:

3D坐标系中 点 的 平移、旋转和缩放_第8张图片

 

总结

有了以上平移、旋转、缩放矩阵后,我们就可以通过矩阵乘法求得点P任意变化后坐标:

 

 

你可能感兴趣的:(游戏编程)