一、Scale、Rotate、Translation
对于拉伸和旋转变化基本形式为:
[x′y′z′]=P[xyz]
\left[\begin{matrix}
x' \\
y' \\
z'
\end{matrix}\right] =P\left[\begin{matrix}
x \\
y \\
z
\end{matrix}\right]
x′y′z′=Pxyz
其中PPP是变化矩阵,对于拉伸变化来讲,需要具体根据拉伸后以及拉伸前的图形求解该矩阵。
对于旋转变化来讲,只有对于x,y,z三个轴的旋转的组合为其他变化,如果旋转轴不过原点,可以先做平移变化移到过原点,然后再进行旋转变化,最后再平移回去。具体的对于x,y,z的旋转矩阵如下:
Rx=[1000cosθ−sinθ0sinθcosθ]Ry=[cosθ0sinθ010−sinθ0cosθ]Rz=[cosθ−sinθ0sinθcosθ0001]
R_x=\left[\begin{matrix}
1 &0 &0\\
0 &cos\theta &-sin\theta \\
0 &sin\theta &cos\theta
\end{matrix}\right]\\
R_y=\left[\begin{matrix}
cos\theta &0 &sin\theta\\
0 &1 &0 \\
-sin\theta &0 &cos\theta
\end{matrix}\right]\\
R_z=\left[\begin{matrix}
cos\theta &-sin\theta &0\\
sin\theta &cos\theta &0 \\
0 &0 &1
\end{matrix}\right]
Rx=1000cosθsinθ0−sinθcosθRy=cosθ0−sinθ010sinθ0cosθRz=cosθsinθ0−sinθcosθ0001
本身旋转矩阵就是正交矩阵,所以如果顺时针旋转θ\thetaθ角,只需求旋转矩阵的转置(也就是逆)即可。
对于平移变化来讲,是不能用矩阵乘法表示的,只能用矩阵加法表示:
[x′y′z′]=[xyz]+[x0y0z0]
\left[\begin{matrix}
x'\\
y' \\
z'
\end{matrix}\right]=\left[\begin{matrix}
x\\
y \\
z
\end{matrix}\right]+\left[\begin{matrix}
x_0\\
y_0\\
z_0
\end{matrix}\right]
x′y′z′=xyz+x0y0z0
二、Homogenous Coordinate
齐次坐标系把平移变化和拉伸/旋转变化同时用一次乘法完成,三维情况下形式如下
[x′y′z′w′]=[P3∗3tXtytX01][xyzw]
\left[\begin{matrix}
x' \\
y' \\
z' \\
w'
\end{matrix}\right]=\left[\begin{matrix}
P_{3*3} &t_X\\
&t_y\\
&t_X\\
0 &1
\end{matrix}\right]\left[\begin{matrix}
x \\
y \\
z \\
w
\end{matrix}\right]
x′y′z′w′=P3∗30tXtytX1xyzw
其中PPP为拉伸/旋转的变化矩阵,t⃗\vec tt为平移向量,w在表示点的时候是1,表示向量的时候是0,本身w并没有特殊含义,只是为了运算方便加的一个量,当w不为1时,可以同除w进行归一。
特别注意齐次坐标系先进行拉伸/旋转在进行平移,如果你的变化需要先平移然后再拉伸/旋转,需要写成以下形式:
x⃗′=R⋅T⋅x⃗
\vec x' = R\cdot T \cdot \vec x
x′=R⋅T⋅x
T为平移变化,R为旋转/拉伸变化,可以应用结合律既RT合并成一个矩阵再作用,但不能交换顺序。
三、Rodrigues旋转公式
具体推导和内容见:https://www.cnblogs.com/wtyuan/p/12324495.html