今天我们一起来讨论下学习图形学过程中经常傻傻分不清楚的旋转方向,三维的逆时针究竟是如何定义的?Games101中闫令琪闫神浅浅提了一下的三维旋转矩阵绕y轴旋转的情况为何与众不同?下面就跟我一起探索吧!如果喜欢我的文章记得点赞关注我哦~ 在文章之前,b站视频:聊聊三维旋转矩阵的前世今生 也对这一内容做了探讨,大家可以结合文章和视频一起理解一下哦~ 文章则对视频中没有深入展开的坐标系加以补充,也提出了另一种思路来加深对三维旋转矩阵的理解。
一、相关概念
1.右手系
规定把右手放在原点的位置,使大拇指,食指和中指互成直角,把大拇指指向x轴的正方向,食指指向y轴的正方向,此时中指所指的方向就是z轴的正方向,由此构成的坐标系就称为右手坐标系 。
或者使用类似与右手螺旋定则的方式定义右手系,将右手的四指 (除去大拇指的其余手指) 沿着第一个坐标轴 (x轴) 的正向伸展,再将他们向第二个轴(y轴)的正方向环绕(旋转方向如上图右侧子图所示),此时大拇指的方向就是第三个轴(z轴)的正方向,由此构成的坐标系就称为右手坐标系 。
2.旋转方向
我们经常会困惑三维空间中的逆时针顺时针是如何定义的,网上也很少有清晰的定义,这里我从《3D数学基础:图形与游戏开发》[ 1 ] ^{[1]} [ 1 ] 一书中摘录了相关定义供大家参考。
下面是三维空间旋转方向的几种定义方式,以后在没有特殊说明的情况下,旋转方向默认按照逆时针 方向(正),此逆时针方向为从旋转轴的正端点向负端点方向看 的逆时针。
右手系下
从哪里看
正方向
负方向
从轴的负端点向正端点看
顺时针
逆时针
从轴的正端点向负端点看
逆时针
顺时针
3.向量叉乘方向[ 2 ] ^{[2]} [ 2 ]
叉积 (又名外积)
a ⃗ × b ⃗ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ sin ( θ ) n ⃗ \vec{\displaystyle\mathbf{a}} \times \vec{\displaystyle\mathbf{b}} = {\displaystyle \|\mathbf {\vec{a}} \|} {\displaystyle \|\mathbf {\vec{b}} \|} \sin(\theta) {\displaystyle \mathbf {\vec{n}} } a × b = ∥ a ∥ ∥ b ∥ sin ( θ ) n
其中
θ {\displaystyle \theta } θ 表示 a ⃗ \vec{\displaystyle\mathbf{a}} a 和 b ⃗ \vec{\displaystyle\mathbf{b}} b 在它们所定义的平面上的夹角(0 ∘ ≤ θ ≤ 18 0 ∘ {\displaystyle 0^{\circ }\leq \theta \leq 180^{\circ }} 0 ∘ ≤ θ ≤ 18 0 ∘ ;
∥ a ⃗ ∥ {\displaystyle \|\mathbf {\vec{a}} \|} ∥ a ∥ 和 ∥ b ⃗ ∥ {\displaystyle \|\mathbf {\vec{b}} \|} ∥ b ∥ 是向量 a ⃗ \vec{\displaystyle\mathbf{a}} a 和 b ⃗ \vec{\displaystyle\mathbf{b}} b 的模长;
而 n ⃗ {\displaystyle \mathbf {\vec{n}} } n 则是一个与 a ⃗ \vec{\displaystyle\mathbf{a}} a 和 b ⃗ \vec{\displaystyle\mathbf{b}} b 所构成的平面垂直的单位向量,方向由右手定则决定
方向
向量 n ⃗ {\vec{ \displaystyle \mathbf {n} } } n 的方向由右手定则决定:将右手食指指向a ⃗ \vec{\displaystyle\mathbf{a}} a 的方向、中指指向 b ⃗ \vec{\displaystyle\mathbf{b}} b 的方向,则此时拇指的方向即为 n ⃗ {\displaystyle \mathbf {\vec{n}} } n 的方向。
使用这一定则意味着外积满足反交换律,a ⃗ × b ⃗ = − ( b ⃗ × a ⃗ ) {\displaystyle \mathbf {\vec{a}} \times \mathbf {\vec{b}} =-(\mathbf {\vec{b}} \times \mathbf {\vec{a}} )} a × b = − ( b × a ) :将右手食指指向 b ⃗ \vec{\displaystyle\mathbf{b}} b 、中指指向a ⃗ \vec{\displaystyle\mathbf{a}} a ,那么拇指就必定指向相反方向,即翻转了外积的符号。
坐标表示(图形学里常用,所以提一下)
基向量: i ⃗ \vec{\displaystyle \mathbf {i}} i 、j ⃗ \vec{\displaystyle \mathbf {j}} j 、k ⃗ \vec{\displaystyle \mathbf {k}} k
满足以下等式:
i ⃗ × j ⃗ = k ⃗ j ⃗ × k ⃗ = i ⃗ k ⃗ × i ⃗ = j ⃗ ⃗ {\displaystyle
{\begin{aligned}
\mathbf {\vec{i}} \times \mathbf {\vec{j}} &=\mathbf {\vec{k}} \\
\mathbf {\vec{j}} \times \mathbf {\vec{k}} &=\mathbf {\vec{i}} \\
\mathbf {\vec{k}} \times \mathbf {\vec{i}} &=\mathbf {\vec{\vec{j}}}
\end{aligned}}} i × j j × k k × i = k = i = j
向量 a ⃗ \vec{\displaystyle\mathbf{a}} a 和 b ⃗ \vec{\displaystyle\mathbf{b}} b 可以定义为平行于基向量的三个正交元素之和:
a ⃗ = a 1 i ⃗ + a 2 j ⃗ + a 3 k ⃗ b ⃗ = b 1 i ⃗ + b 2 j ⃗ + b 3 k ⃗ {\displaystyle
{\begin{aligned}\mathbf {\vec{a}} &=a_{1}\mathbf {\vec{i}} +a_{2}\mathbf {\vec{j}} +a_{3}\mathbf {\vec{k}} \\
\mathbf {\vec{b}} &=b_{1}\mathbf {\vec{i}} +b_{2}\mathbf {\vec{j}} +b_{3}\mathbf {\vec{k}}
\end{aligned}}} a b = a 1 i + a 2 j + a 3 k = b 1 i + b 2 j + b 3 k
外积可以表达为这样的行列式:
a ⃗ × b ⃗ = ∣ i ⃗ j ⃗ k ⃗ a 1 a 2 a 3 b 1 b 2 b 3 ∣ {\displaystyle \mathbf {\vec{a}\times \vec{b}} ={\begin{vmatrix}\mathbf {\vec{i}} &\mathbf {\vec{j}} &\mathbf {\vec{k}} \\a_{1}&a_{2}&a_{3}\\b_{1}&b_{2}&b_{3}\\\end{vmatrix}}} a × b = ∣ ∣ i a 1 b 1 j a 2 b 2 k a 3 b 3 ∣ ∣
使用拉普拉斯沿第一行展开,得:
a ⃗ × b ⃗ = ∣ a 2 a 3 b 2 b 3 ∣ i ⃗ − ∣ a 1 a 3 b 1 b 3 ∣ j ⃗ + ∣ a 1 a 2 b 1 b 2 ∣ k ⃗ = ( a 2 b 3 − a 3 b 2 ) i ⃗ − ( a 1 b 3 − a 3 b 1 ) j ⃗ + ( a 1 b 2 − a 2 b 1 ) k ⃗ {\displaystyle {\begin{aligned}\mathbf {\vec{a}\times \vec{b}} &={\begin{vmatrix}a_{2}&a_{3}\\b_{2}&b_{3}\end{vmatrix}}\mathbf {\vec{i}} -{\begin{vmatrix}a_{1}&a_{3}\\b_{1}&b_{3}\end{vmatrix}}\mathbf {\vec{j}} +{\begin{vmatrix}a_{1}&a_{2}\\b_{1}&b_{2}\end{vmatrix}}\mathbf {\vec{k}} \\&=(a_{2}b_{3}-a_{3}b_{2})\mathbf {\vec{i}} -(a_{1}b_{3}-a_{3}b_{1})\mathbf {\vec{j}} +(a_{1}b_{2}-a_{2}b_{1})\mathbf {\vec{k}} \end{aligned}}} a × b = ∣ ∣ a 2 b 2 a 3 b 3 ∣ ∣ i − ∣ ∣ a 1 b 1 a 3 b 3 ∣ ∣ j + ∣ ∣ a 1 b 1 a 2 b 2 ∣ ∣ k = ( a 2 b 3 − a 3 b 2 ) i − ( a 1 b 3 − a 3 b 1 ) j + ( a 1 b 2 − a 2 b 1 ) k
二、旋转矩阵(左乘矩阵)
-1. 旋转方向
再次强调 下面提到的三维旋转方向的逆时针均按照下表的定义方式操作。
右手系
从哪里看
正方向
从轴的正端点向负端点看
逆时针
0. 二维旋转矩阵
点 ( x , y ) (x, y) ( x , y ) 沿着如图 x x x 到 y y y 方向(逆时针)旋转 θ \theta θ 角度
对应的旋转矩阵按照如下(左乘)方式作用在点 ( x , y ) (x, y) ( x , y ) 上,推导过程略。
[ cos θ − sin θ sin θ cos θ ] [ x y ] {\displaystyle
\left[
{\begin{matrix}
\cos\theta & -\sin\theta \\
\sin \theta & \cos\theta
\end{matrix}}
\right] \left[ \begin{matrix}x\\
y\end{matrix}\right]
} [ cos θ sin θ − sin θ cos θ ] [ x y ]
1. 绕x轴旋转
2. 绕y轴旋转
3. 绕z轴旋转
[1]FletcherDunn, IanParberry, 邓恩,等. 3D数学基础:图形与游戏开发[M]. 清华大学出版社, 2005.
[2] zh.wikipedia.org/wiki/%E5%8F…