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).Możemy zapisać:
{v′x=‖R‖cos(θ+α)v′y=‖R‖sin(θ+α)
{v′x=‖R‖(cosθcosα−sinθsinα)v′y=‖R‖(sinθcosα+cosθsinα)
{v′x=‖R‖(vx‖R‖cosα−vy‖R‖sinα)v′y=‖R‖(vy‖R‖cosα+vx‖R‖sinα)
{v′x=vxcosα−vysinαv′y=vycosα+vxsinα
Co możemy zapisać jako jako:{v′x=‖R‖(cosθcosα−sinθsinα)v′y=‖R‖(sinθcosα+cosθsinα)
{v′x=‖R‖(vx‖R‖cosα−vy‖R‖sinα)v′y=‖R‖(vy‖R‖cosα+vx‖R‖sinα)
{v′x=vxcosα−vysinαv′y=vycosα+vxsinα
[v′xv′y]=[cosα−sinαsinαcosα][vxvy]
Stąd macierz rotacji 2D:R2D=[cosα−sinαsinαcosα]
Przechodząc na 3D:{v′x=vxcosα−vysinα+vz⋅0v′y=vycosα+vxsinα+vz⋅0v′z=vx⋅0+vy⋅0+vz⋅1
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: X→Z, Y→X, Z→YW 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: X→Y, Z→X, Y→Z. 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=R−1⇔RTR=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