2011-07-11

Macierz rotacji

Macierz rotacji pozwala nam na rotacje punktu wokół środka układu współrzędnych wokół wybranej osi układu współrzędnych. Dla 3D ma ona wymiary 3x3. Dla 2D 2x2. Rotacja punktu wokół środka układu współrzędnych nie zmienia odległości punktu od tego środka.

Wyznacznik takiej macierzy równy jest 1. Co wynika z faktu, że jej kolumny traktowane jako wektory jednostkowe tworzą nowy układ współrzędnych. Dowolne składanie (mnożenie) macierzy rotacji nie zmienia tej własności.

Specyficznym przykładem macierzy rotacji jest macierz jednostkowa, która nie zmienia położenia obracanego obiektu.

Macierz odwrotna do macierzy rotacji też jest macierzą rotacji. Macierz odwrotna do macierzy rotacji jest rotacją odwrotną.

Powyższe stwierdzenia są także prawdziwe dla złożeń rotacji i translacji. Skalowanie zmienia jedynie to, że kolumny nie są wektorami jednostkowymi.

Zakładamy, że nasz układ współrzędnych jest lewoskrętny.

Macierz rotacji 3D wokół osi Z

Mamy wektor $\mathbf{\vec V(v_x,v_y,v_z)}$, który obracamy o kąt $\mathbf{\alpha}$ wokół osi Z. Współrzędna $\mathbf{v_z}$ nie ulega zmiania. Obrotowi podlega rzut wektora $\mathbf{\vec V}$ na płaszczyznę XY. Oznaczmy go przez $\mathbf{\vec R(v_x,v_y)}$.
image/svg+xml x y θ R R' α xy xy
Możemy zapisać:

$\left\{\begin{matrix}
v'_x=\left \| R \right \| \cos(\theta+ \alpha)\\
v'_y=\left \| R \right \| \sin(\theta+ \alpha)
\end{matrix}\right.$

$\left\{\begin{matrix}
v'_x=\left \| R \right \|(\cos \theta \cos \alpha - \sin \theta \sin \alpha)\\
v'_y=\left \| R \right \|(\sin \theta \cos \alpha + \cos \theta \sin \alpha)
\end{matrix}\right.$

$\left\{\begin{matrix}
v'_x=\left \| R \right \|(\displaystyle\frac{v_x}{\left \| R \right \|}\cos \alpha - \frac{v_y}{\left \| R \right \|}\sin \alpha)\\
v'_y=\left \| R \right \|(\displaystyle\frac{v_y}{\left \| R \right \|}\cos \alpha + \frac{v_x}{\left \| R \right \|}\sin \alpha)
\end{matrix}\right.$

$\left\{\begin{matrix}
v'_x=v_x \cos \alpha - v_y \sin \alpha\\
v'_y=v_y \cos \alpha + v_x \sin \alpha
\end{matrix}\right.$
Co możemy zapisać jako jako:

$\begin{bmatrix}
v'_x\\
v'_y
\end{bmatrix}=\begin{bmatrix}
\cos \alpha & -sin \alpha \\
\sin \alpha & \cos \alpha \\
\end{bmatrix}\;\;
\begin{bmatrix}
v_x \\
v_y \\
\end{bmatrix}$
Stąd macierz rotacji 2D:

$R_{2D}=\begin{bmatrix}
\cos \alpha & -sin \alpha \\
\sin \alpha & \cos \alpha
\end{bmatrix}$
Przechodząc na 3D:

$\left\{\begin{array}{lcccccc}
v'_x & = & v_x \cos \alpha &-& v_y \sin \alpha &+& v_z \cdot 0\\
v'_y & = & v_y \cos \alpha &+& v_x \sin \alpha &+& v_z \cdot 0\\
v'_z & = & v_x \cdot 0 &+& v_y \cdot 0 &+& v_z \cdot 1
\end{array}\right.$
Stąd macierz rotacji 3D wokół osi Z:

$R_Z=\begin{bmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{bmatrix}$

Macierz rotacji 3D wokół osi Y

Kąt $\mathbf{\theta}$ mierzymy od osi $\mathbf{Z}$. Czyli zamieniamy: $\mathbf{X \rightarrow Z}$, $\mathbf{Y \rightarrow X}$, $\mathbf{Z \rightarrow Y}$

W macierzy rotacji $\mathbf{R_Z}$ wymieniamy odpowiednio kolumny i wiersze. Zmian możemy dokonać także wcześniej w układzie trzech równań i wyprowadzić z nich nową macierz. Możemy także zacząć od samego początku. Powinniśmy otrzymać:

$R_Y=\begin{bmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{bmatrix}$

Macierz rotacji 3D wokół osi X

Kąt $\mathbf{\theta}$ mierzymy od osi $\mathbf{Y}$. Czyli zamieniamy: $\mathbf{X \rightarrow Y}$, $\mathbf{Z \rightarrow X}$, $\mathbf{Y \rightarrow Z}$. Macierz rotacji ma postać:

$R_X=\begin{bmatrix}
1 & 0 & 0 \\
0 & \cos \alpha & -\sin \alpha \\
0 & \sin \alpha & \cos \alpha
\end{bmatrix}$

Przykład wyznaczania macierzy rotacji 4x4 w C#

public static Matrix4 CreateRotateX(double a_angle)
{
    double sin = Math.Sin(a_angle);
    double cos = Math.Cos(a_angle);

    return new Matrix4(

        1, 0, 0, 0, 
        0, cos, -sin, 0, 
        0, sin, cos, 0,
        0, 0, 0, 1 );
}

public static Matrix4 CreateRotateY(double a_angle)
{
    double sin = Math.Sin(a_angle);
    double cos = Math.Cos(a_angle);

    return new Matrix4(

        cos, 0, sin, 0, 
        0, 1, 0, 0, 
        -sin, 0, cos, 0, 
        0, 0, 0, 1 );
}

public static Matrix4 CreateRotateZ(double a_angle)
{
    double sin = Math.Sin(a_angle);
    double cos = Math.Cos(a_angle);

    return new Matrix4(

        cos, -sin, 0, 0, 
        sin, cos, 0, 0, 
        0, 0, 1, 0, 
        0, 0, 0, 1 );
}

Właściwości macierzy rotacji

  • $R^T=R^{-1} \Leftrightarrow R^TR=I$
  • $R_\alpha R_\beta=R_{\alpha+\beta}$
  • $\det R=1$
  • $R_{alpha=0}=I$
  • Traktując kolumny lub wiersze jako wektory ich długości są równe 1.
  • Wektory kolumn lub wierszy są do siebie wzajemnie prostopadłe.

Brak komentarzy:

Prześlij komentarz