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

时间:2024-03-15 18:54:45

基础概念

矩阵

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

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

矩阵的乘法:

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

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

坐标系

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

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

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

平移

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

但是在数学计算或游戏编程中,我们都希望可以运用矩阵的乘法来表示点的平移。我们希望有一个公式:3D坐标系中 点 的 平移、旋转和缩放 , 其中3D坐标系中 点 的 平移、旋转和缩放为一个矩阵

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

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

其中:

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

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

旋转

             

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

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

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

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

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

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

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

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

由图可得,旋转后3D坐标系中 点 的 平移、旋转和缩放的x和y坐标分别可表示为:

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

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

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

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

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

按照矩阵乘法,我们3D坐标系中 点 的 平移、旋转和缩放

 

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

其中绕Z轴旋转矩阵3D坐标系中 点 的 平移、旋转和缩放 为:

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

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

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

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

 

缩放

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

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

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

其中缩放矩阵3D坐标系中 点 的 平移、旋转和缩放为:

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

 

总结

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

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