3D坐标系旋转Z轴

案例

在三维空间中,已知红色点在蓝色坐标系中的位置为(x_1, y_1, z_1).

已知蓝色坐标系是围绕黑色坐标系着Z轴旋转了\alpha角度。

求解:红色点在黑色坐标系中的位置(x_2, y_2, z_2)

分析与推导

蓝色坐标系

我们将原点定义为O,将红色点定义为P。

红色点在蓝色坐标系中的坐标点,我们可以看做是向量\vec {OP}

我们可以将三维空间的点和坐标系的关系理解为一个长方体

根据长方体向量计算经验,我们可以得出以下的结论:

\vec {OP} = \vec {X} + \vec {Y} + \vec {Z}

其中:

\vec {X} = (x_1, 0, 0)
\vec {Y} = (0, y_1, 0)
\vec {Z} = (0, 0, z_1)

我们采用向量缩放的特点,在X轴方向定义单位向量\vec {i_a}, 长度为1,方向沿着X轴正向;在Y轴方向定义单位向量\vec {j_a}, 长度为1,方向沿着Y轴正向;在Z轴方向定义单位向量\vec {k_a}, 长度为1,方向沿着Z轴正向。那么:

\vec {X} = x_a \cdot \vec {i_a}
\vec {Y} = y_a \cdot \vec {j_a}
\vec {Z} = z_a \cdot \vec {k_a}

其中,x_a,y_a,z_a分别代表的在X,Y,Z方向上的数量,其实他们就是P点在蓝色坐标系中的坐标对应的值\vec {x_1},\vec {y_1},\vec {z_1}

那么其实:

\vec {X} = x_1 \cdot \vec {i_a}
\vec {Y} = y_1 \cdot \vec {j_a}
\vec {Z} = z_1 \cdot \vec {k_a}

我们已知的是:

\vec {OP} = \vec {X} + \vec {Y} + \vec {Z}

那么我们可以得到:

\vec {OP} = x_1 \cdot \vec {i_a} + y_1 \cdot \vec {j_a} + z_1 \cdot \vec {k_a}

黑色坐标系

我们将原点定义为O,将红色点定义为P。

红色点在黑色色坐标系中的坐标点,我们可以看做是向量\vec {OP}

我们可以将三维空间的点和坐标系的关系理解为一个长方体

根据长方体向量计算经验,我们可以得出以下的结论:

\vec {OP} = \vec {X} + \vec {Y} + \vec {Z}

其中:

\vec {X} = (x_2, 0, 0)
\vec {Y} = (0, y_2, 0)
\vec {Z} = (0, 0, z_2)

我们采用向量缩放的特点,在X轴方向定义单位向量\vec {i_b}, 长度为1,方向沿着X轴正向;在Y轴方向定义单位向量\vec {j_b}, 长度为1,方向沿着Y轴正向;在Z轴方向定义单位向量\vec {k_b}, 长度为1,方向沿着Z轴正向。那么:

\vec {X} = x_b \cdot \vec {i_b}
\vec {Y} = y_b \cdot \vec {j_b}
\vec {Z} = z_b \cdot \vec {k_b}

其中,x_b,y_b,z_b分别代表的在X,Y,Z方向上的数量,其实他们就是P点在黑色坐标系中的坐标对应的值\vec {x_2},\vec {y_2},\vec {z_2}

那么其实:

\vec {X} = x_2 \cdot \vec {i_b}
\vec {Y} = y_2 \cdot \vec {j_b}
\vec {Z} = z_2 \cdot \vec {k_b}

我们已知的是:

\vec {OP} = \vec {X} + \vec {Y} + \vec {Z}

那么我们可以得到:

\vec {OP} = x_2 \cdot \vec {i_b} + y_2 \cdot \vec {j_b} + z_2 \cdot \vec {k_b}

综合分析

对于向量\vec {OP}而言,无论在哪个坐标系,他的大小和方向是不变的,只是观测的坐标系有所变化。

根据前面分析的结论我们可以直接得到:

x_1 \cdot \vec {i_a} + y_1 \cdot \vec {j_a} + z_1 \cdot \vec {k_a} = x_2 \cdot \vec {i_b} + y_2 \cdot \vec {j_b} + z_2 \cdot \vec {k_b}

推导(1):

式子的两边同时乘以\vec {i_b}:

x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b} = x_2 \cdot \vec {i_b} \cdot \vec {i_b} + y_2 \cdot \vec {j_b} \cdot \vec {i_b} + z_2 \cdot \vec {k_b} \cdot \vec {i_b}

观察右侧部分中:

\vec {i_b} \cdot \vec {i_b} = 1
\vec {j_b} \cdot \vec {i_b} = 0
\vec {k_b} \cdot \vec {i_b} = 0

因此:

x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b} = x_2 \cdot 1 + y_2 \cdot 0 + z_2 \cdot 0

我们可以得出结论:

x_2 = x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b}

推导(2):

式子的两边同时乘以\vec {j_b}:

x_1 \cdot \vec {i_a} \cdot \vec {j_b} + y_1 \cdot \vec {j_a} \cdot \vec {j_b} + z_1 \cdot \vec {k_a} \cdot \vec {j_b} = x_2 \cdot \vec {i_b} \cdot \vec {j_b} + y_2 \cdot \vec {j_b} \cdot \vec {j_b} + z_2 \cdot \vec {k_b} \cdot \vec {j_b}

观察右侧部分中:

\vec {i_b} \cdot \vec {j_b} = 0
\vec {j_b} \cdot \vec {j_b} = 1
\vec {k_b} \cdot \vec {j_b} = 0

因此:

x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b} = x_2 \cdot 0 + y_2 \cdot 1 + z_2 \cdot 0

我们可以得出结论:

y_2 = x_1 \cdot \vec {i_a} \cdot \vec {j_b} + y_1 \cdot \vec {j_a} \cdot \vec {j_b} + z_1 \cdot \vec {k_a} \cdot \vec {j_b}

推导(3):

式子的两边同时乘以\vec {k_b}:

x_1 \cdot \vec {i_a} \cdot \vec {k_b} + y_1 \cdot \vec {j_a} \cdot \vec {k_b} + z_1 \cdot \vec {k_a} \cdot \vec {k_b} = x_2 \cdot \vec {i_b} \cdot \vec {k_b} + y_2 \cdot \vec {j_b} \cdot \vec {k_b} + z_2 \cdot \vec {k_b} \cdot \vec {k_b}

观察右侧部分中:

\vec {i_b} \cdot \vec {k_b} = 0
\vec {j_b} \cdot \vec {k_b} = 0
\vec {k_b} \cdot \vec {k_b} = 1

因此:

x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b} = x_2 \cdot 0 + y_2 \cdot 0 + z_2 \cdot 1

我们可以得出结论:

z_2 = x_1 \cdot \vec {i_a} \cdot \vec {k_b} + y_1 \cdot \vec {j_a} \cdot \vec {k_b} + z_1 \cdot \vec {k_a} \cdot \vec {k_b}

综合推导:

已知结论:

x_2 = x_1 \cdot \vec {i_a} \cdot \vec {i_b} + y_1 \cdot \vec {j_a} \cdot \vec {i_b} + z_1 \cdot \vec {k_a} \cdot \vec {i_b}
y_2 = x_1 \cdot \vec {i_a} \cdot \vec {j_b} + y_1 \cdot \vec {j_a} \cdot \vec {j_b} + z_1 \cdot \vec {k_a} \cdot \vec {j_b}
z_2 = x_1 \cdot \vec {i_a} \cdot \vec {k_b} + y_1 \cdot \vec {j_a} \cdot \vec {k_b} + z_1 \cdot \vec {k_a} \cdot \vec {k_b}

通过矩阵转换为:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = \left[\begin{matrix} \vec {i_a} \cdot \vec {i_b} & \vec {j_a} \cdot \vec {i_b} & \vec {k_a} \cdot \vec {i_b} \\ \vec {i_a} \cdot \vec {j_b} & \vec {j_a} \cdot \vec {j_b} & \vec {k_a} \cdot \vec {j_b} \\ \vec {i_a} \cdot \vec {k_b} & \vec {j_a} \cdot \vec {k_b} & \vec {k_a} \cdot \vec {k_b} \\ \end{matrix}\right] \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]

(1): \vec {i_a} \cdot \vec {i_b}

\vec {i_a} \cdot \vec {i_b} = 1 \cdot 1 \cdot cos(\alpha)
\vec {i_a} \cdot \vec {i_b} = cos(\alpha)

(2): \vec {j_a} \cdot \vec {i_b}

\vec {j_a} \cdot \vec {i_b} = 1 \cdot 1 \cdot cos(90°+\alpha)
\vec {j_a} \cdot \vec {i_b} = -sin(\alpha)

(3): $\vec {k_a} \cdot \vec {i_b} $

\vec {k_a} \cdot \vec {i_b} = 1 \cdot 1 \cdot cos(90°)
\vec {k_a} \cdot \vec {i_b} = 0

(4): \vec {i_a} \cdot \vec {j_b}

\vec {i_a} \cdot \vec {j_b} = 1 \cdot 1 \cdot cos(90°-\alpha)
\vec {i_a} \cdot \vec {j_b} = sin(\alpha)

(5): \vec {j_a} \cdot \vec {j_b}

\vec {j_a} \cdot \vec {j_b} = 1 \cdot 1 \cdot cos(\alpha)
\vec {j_a} \cdot \vec {j_b} = cos(\alpha)

(6): \vec {k_a} \cdot \vec {j_b}

\vec {k_a} \cdot \vec {j_b} = 1 \cdot 1 \cdot cos(90°)
\vec {k_a} \cdot \vec {j_b} = 0

(7): \vec {i_a} \cdot \vec {k_b}

\vec {i_a} \cdot \vec {k_b} = 1 \cdot 1 \cdot cos(90°)
\vec {i_a} \cdot \vec {k_b} = 0

(8): \vec {j_a} \cdot \vec {k_b}

\vec {j_a} \cdot \vec {k_b} = 1 \cdot 1 \cdot cos(90°)
\vec {j_a} \cdot \vec {k_b} = 0

(9): \vec {k_a} \cdot \vec {k_b}

\vec {k_a} \cdot \vec {k_b} = 1 \cdot 1 \cdot cos(0°)
\vec {k_a} \cdot \vec {k_b} = 1

综上所述:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = \left[\begin{matrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \\ \end{matrix}\right] \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]