求将三维空间中一组3向量基转换为另一组的旋转矩阵
问题背景
我们有三维空间中的一组标准基:Vx = (1,0,0),Vy = (0,1,0),Vz=(0,0,1),该基通过旋转矩阵M分别转换为Vx'、Vy'、Vz',得到以下矩阵方程:
M * Vx = Vx' M * Vy = Vy' M * Vz = Vz'
这对应关于矩阵M的9个分量的9个线性方程。我们需要将其转化为A * m = b的形式(便于用numpy等工具求解),其中:
m是M的未知分量按行优先排列的列向量:[m11, m12, m13, m21, m22, m23, m31, m32, m33]^T(上标T表示转置)A为9×9的系数矩阵b为9×1的常数列向量
逐方程展开推导
首先明确旋转矩阵M的结构:
M = [ [m11, m12, m13], [m21, m22, m23], [m31, m32, m33] ]
我们逐个展开矩阵乘法方程:
第一个方程:
M * Vx = Vx'
Vx是列向量(1,0,0)^T,矩阵乘法结果就是M的第一列,等于Vx' = (vx'₁, vx'₂, vx'₃)^T,对应3个线性方程:m11 = vx'₁m21 = vx'₂m31 = vx'₃
第二个方程:
M * Vy = Vy'
Vy是列向量(0,1,0)^T,乘法结果是M的第二列,等于Vy' = (vy'₁, vy'₂, vy'₃)^T,对应3个线性方程:m12 = vy'₁m22 = vy'₂m32 = vy'₃
第三个方程:
M * Vz = Vz'
Vz是列向量(0,0,1)^T,乘法结果是M的第三列,等于Vz' = (vz'₁, vz'₂, vz'₃)^T,对应3个线性方程:m13 = vz'₁m23 = vz'₂m33 = vz'₃
A矩阵与b向量的表达式
现在把这9个方程映射到A * m = b的形式:
系数矩阵A
A是一个9×9的置换矩阵,每行只有一个位置为1(对应m中需要被选中的分量),其余位置为0:
A = [ [1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1] ]
每行对应的逻辑:
- 第1行:选中
m11对应vx'₁ - 第2行:选中
m21对应vx'₂ - 第3行:选中
m31对应vx'₃ - 第4行:选中
m12对应vy'₁ - 第5行:选中
m22对应vy'₂ - 第6行:选中
m32对应vy'₃ - 第7行:选中
m13对应vz'₁ - 第8行:选中
m23对应vz'₂ - 第9行:选中
m33对应vz'₃
常数向量b
b是将三个变换后的基向量的分量按顺序排列的列向量:
b = [vx'₁, vx'₂, vx'₃, vy'₁, vy'₂, vy'₃, vz'₁, vz'₂, vz'₃]^T
完整矩阵表达式
把A * m = b写成完整的矩阵乘法形式:
[1 0 0 0 0 0 0 0 0] [m11] [vx'₁] [0 0 0 1 0 0 0 0 0] [m12] [vx'₂] [0 0 0 0 0 0 1 0 0] [m13] [vx'₃] [0 1 0 0 0 0 0 0 0] * [m21] = [vy'₁] [0 0 0 0 1 0 0 0 0] [m22] [vy'₂] [0 0 0 0 0 0 0 1 0] [m23] [vy'₃] [0 0 1 0 0 0 0 0 0] [m31] [vz'₁] [0 0 0 0 0 1 0 0 0] [m32] [vz'₂] [0 0 0 0 0 0 0 0 1] [m33] [vz'₃]
更新:我因该问题获得了“Notable question”奖项,特此更新以解除限制。请注意问题表述十分明确,我并非在寻找工具,“是否有工具可帮助推导逐分量公式?”仅为附加内容,无关紧要。
内容的提问来源于stack exchange,提问作者Anton Ovsyannikov

