计算机图形学——Rodrigues’ Rotation Formula 罗德里格斯旋转公式及其矩阵形式的推导
罗德里格旋转公式是计算三维空间中,一个向量绕旋转轴旋转给定角度以后得到的新向量的计算公式。这个公式使用原向量,旋转轴及它们叉积作为标架表示出旋转以后的向量。可以改写为矩阵形式,被广泛应用于空间解析几何和计算机图形学领域,成为刚体运动的基本计算公式。
1.定义
罗德里格斯公式主要用于描述一个向量 v\mathbf{v}v 围绕一个单位旋转轴 n\mathbf{n}n 旋转一个角度 α\alphaα 后的结果。
定义旋转后的向量为 v′\mathbf{v}'v′ :
v′=R(n,α)v \mathbf{v}' = R(\mathbf{n}, \alpha) \mathbf{v} v′=R(n,α)v
其中,旋转矩阵 R(n,α)R(\mathbf{n}, \alpha)R(n,α) 为旋转矩阵,我们的目标是推导这一旋转矩阵 R(n,α)R(\mathbf{n}, \alpha)R(n,α) 的表达式。
2. 向量旋转的几何描述
将向量 v\mathbf{v}v 分解为两个部分:
- 平行于旋转轴 n\mathbf{n}n 的分量:
v∥=(v⋅n)n
\mathbf{v}_\parallel = (\mathbf{v} \cdot \mathbf{n})\mathbf{n}
v∥=(v⋅n)n
2. 垂直于旋转轴 n\mathbf{n}n 的分量:
v⊥=v−v∥=v−(v⋅n)n \mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel = \mathbf{v} - (\mathbf{v} \cdot \mathbf{n})\mathbf{n} v⊥=v−v∥=v−(v⋅n)n
旋转的几何过程:
- 平行分量 v∥\mathbf{v}_\parallelv∥ 不变。
- 垂直分量 v⊥\mathbf{v}_\perpv⊥ 在垂直平面内旋转。
3. 分量旋转的数学描述
(1) 平行分量的旋转
旋转不改变平行分量:
v∥′=v∥=(v⋅n)n \mathbf{v}_\parallel' = \mathbf{v}_\parallel = (\mathbf{v} \cdot \mathbf{n})\mathbf{n} v∥′=v∥=(v⋅n)n
(2) 垂直分量的旋转
垂直分量 v⊥\mathbf{v}_\perpv⊥ 在垂直于 n\mathbf{n}n 的平面上旋转,旋转角为 α\alphaα。根据旋转的定义:
v⊥′=cosα v⊥+sinα(n×v) \mathbf{v}_\perp' = \cos\alpha \, \mathbf{v}_\perp + \sin\alpha (\mathbf{n} \times \mathbf{v}) v⊥′=cosαv⊥+sinα(n×v)
代入 v⊥=v−(v⋅n)n\mathbf{v}_\perp = \mathbf{v} - (\mathbf{v} \cdot \mathbf{n})\mathbf{n}v⊥=v−(v⋅n)n:
v⊥′=cosα(v−(v⋅n)n)+sinα(n×v) \mathbf{v}_\perp' = \cos\alpha (\mathbf{v} - (\mathbf{v} \cdot \mathbf{n})\mathbf{n}) + \sin\alpha (\mathbf{n} \times \mathbf{v}) v⊥′=cosα(v−(v⋅n)n)+sinα(n×v)
4. 合并公式
旋转后的向量为:
v′=v∥′+v⊥′ \mathbf{v}' = \mathbf{v}_\parallel' + \mathbf{v}_\perp' v′=v∥′+v⊥′
代入 v∥′=(v⋅n)n\mathbf{v}_\parallel' = (\mathbf{v} \cdot \mathbf{n})\mathbf{n}v∥′=(v⋅n)n 和 v⊥′\mathbf{v}_\perp'v⊥′ 的表达式:
v′=(v⋅n)n+cosα(v−(v⋅n)n)+sinα(n×v) \mathbf{v}' = (\mathbf{v} \cdot \mathbf{n})\mathbf{n} + \cos\alpha (\mathbf{v} - (\mathbf{v} \cdot \mathbf{n})\mathbf{n}) + \sin\alpha (\mathbf{n} \times \mathbf{v}) v′=(v⋅n)n+cosα(v−(v⋅n)n)+sinα(n×v)
化简后:
v′=cosαv+(1−cosα)(v⋅n)n+sinα(n×v) \mathbf{v}' = \cos\alpha \mathbf{v} + (1 - \cos\alpha)(\mathbf{v} \cdot \mathbf{n})\mathbf{n} + \sin\alpha (\mathbf{n} \times \mathbf{v}) v′=cosαv+(1−cosα)(v⋅n)n+sinα(n×v)
这就是罗德里格斯公式的向量形式。
5. 矩阵形式的推导
(1) 旋转的三个部分
将公式分解为矩阵操作:
- cosαv\cos\alpha \mathbf{v}cosαv:
用单位矩阵 III 表示:
cosαv=cosαIv
\cos\alpha \mathbf{v} = \cos\alpha I \mathbf{v}
cosαv=cosαIv
2. (1−cosα)(v⋅n)n(1 - \cos\alpha)(\mathbf{v} \cdot \mathbf{n})\mathbf{n}(1−cosα)(v⋅n)n:
用外积 nn⊤\mathbf{n}\mathbf{n}^\topnn⊤ 表示:
(v⋅n)=n⊤v,(v⋅n)n=(nn⊤)v (\mathbf{v} \cdot \mathbf{n}) = \mathbf{n}^\top \mathbf{v}, \quad (\mathbf{v} \cdot \mathbf{n})\mathbf{n} = (\mathbf{n}\mathbf{n}^\top) \mathbf{v} (v⋅n)=n⊤v,(v⋅n)n=(nn⊤)v
所以:
(1−cosα)(v⋅n)n=(1−cosα)(nn⊤)v
(1 - \cos\alpha)(\mathbf{v} \cdot \mathbf{n})\mathbf{n} = (1 - \cos\alpha)(\mathbf{n}\mathbf{n}^\top)\mathbf{v}
(1−cosα)(v⋅n)n=(1−cosα)(nn⊤)v
3. sinα(n×v)\sin\alpha (\mathbf{n} \times \mathbf{v})sinα(n×v):
用叉乘矩阵(反对称矩阵) [n]×[\mathbf{n}]_\times[n]× 表示两个向量的叉乘:
(n×v)=[n]×v (\mathbf{n} \times \mathbf{v}) = [\mathbf{n}]_\times \mathbf{v} (n×v)=[n]×v
所以:
sinα(n×v)=sinα[n]×v \sin\alpha (\mathbf{n} \times \mathbf{v}) = \sin\alpha [\mathbf{n}]_\times \mathbf{v} sinα(n×v)=sinα[n]×v
(2) 组合成旋转矩阵
将三部分组合:
v′=[cosαI+(1−cosα)nn⊤+sinα[n]×]v \mathbf{v}' = \big[\cos\alpha I + (1 - \cos\alpha)\mathbf{n}\mathbf{n}^\top + \sin\alpha [\mathbf{n}]_\times\big] \mathbf{v} v′=[cosαI+(1−cosα)nn⊤+sinα[n]×]v
因此,旋转矩阵 R(n,α)R(\mathbf{n}, \alpha)R(n,α) 为:
R(n,α)=cosαI+(1−cosα)nn⊤+sinα[n]× R(\mathbf{n}, \alpha) = \cos\alpha I + (1 - \cos\alpha)\mathbf{n}\mathbf{n}^\top + \sin\alpha [\mathbf{n}]_\times R(n,α)=cosαI+(1−cosα)nn⊤+sinα[n]×
6. 叉乘矩阵(反对称矩阵)
反对称矩阵 [n]×[\mathbf{n}]_\times[n]× 是:
[n]×=[0−nznynz0−nx−nynx0] [\mathbf{n}]_\times = \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{bmatrix} [n]×=0nz−ny−nz0nxny−nx0
总结
- 罗德里格斯公式(向量形式):
v′=cosαv+(1−cosα)(v⋅n)n+sinα(n×v) \mathbf{v}' = \cos\alpha \mathbf{v} + (1 - \cos\alpha)(\mathbf{v} \cdot \mathbf{n})\mathbf{n} + \sin\alpha (\mathbf{n} \times \mathbf{v}) v′=cosαv+(1−cosα)(v⋅n)n+sinα(n×v)
- 罗德里格斯旋转矩阵:
R(n,α)=cosαI+(1−cosα)nn⊤+sinα[n]× R(\mathbf{n}, \alpha) = \cos\alpha I + (1 - \cos\alpha)\mathbf{n}\mathbf{n}^\top + \sin\alpha [\mathbf{n}]_\times R(n,α)=cosαI+(1−cosα)nn⊤+sinα[n]×
- 旋转的几何意义:
- 平行分量不变。
- 垂直分量按照角度 α\alphaα 旋转。