Processing math: 100%

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 V(vx,vy,vz), który obracamy o kąt α wokół osi Z. Współrzędna vz nie ulega zmiania. Obrotowi podlega rzut wektora V na płaszczyznę XY. Oznaczmy go przez R(vx,vy).
image/svg+xml x y θ R R' α xy xy
Możemy zapisać:

{vx=Rcos(θ+α)vy=Rsin(θ+α)

{vx=R(cosθcosαsinθsinα)vy=R(sinθcosα+cosθsinα)

{vx=R(vxRcosαvyRsinα)vy=R(vyRcosα+vxRsinα)

{vx=vxcosαvysinαvy=vycosα+vxsinα
Co możemy zapisać jako jako:

[vxvy]=[cosαsinαsinαcosα][vxvy]
Stąd macierz rotacji 2D:

R2D=[cosαsinαsinαcosα]
Przechodząc na 3D:

{vx=vxcosαvysinα+vz0vy=vycosα+vxsinα+vz0vz=vx0+vy0+vz1
Stąd macierz rotacji 3D wokół osi Z:

RZ=[cosαsinα0sinαcosα0001]

Macierz rotacji 3D wokół osi Y

Kąt θ mierzymy od osi Z. Czyli zamieniamy: XZ, YX, ZY

W macierzy rotacji RZ 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ć:

RY=[cosαsinα0sinαcosα0001]

Macierz rotacji 3D wokół osi X

Kąt θ mierzymy od osi Y. Czyli zamieniamy: XY, ZX, YZ. Macierz rotacji ma postać:

RX=[1000cosαsinα0sinαcosα]

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

  • RT=R1RTR=I
  • RαRβ=Rα+β
  • detR=1
  • Ralpha=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