1
Laboratorium komputerowe 11 Transformacje geometryczne obiektu 3D
Współrzędne jednorodne
W przestrzeni trójwymiarowej współrzędne jednorodne znormalizowane punktu 𝑃 o współrzędnych kartezjańskich (𝑃𝑥, 𝑃𝑦, 𝑃𝑧) mają postać (𝑃𝑥, 𝑃𝑦, 𝑃𝑧, 1). Współrzędne jednorodne nieznormalizowane mają postać (𝑃𝑥, 𝑃𝑦, 𝑃𝑧, 𝑤) i 𝑤 ≠ 0.
Punkt o współrzędnych jednorodnych (𝑃𝑥, 𝑃𝑦, 𝑃𝑧, 𝑤) i 𝑤 ≠ 0 ma współrzędne kartezjańskie (𝑃𝑤𝑥,𝑃𝑤𝑦,𝑃𝑤𝑧). Jeśli 𝑤 = 0 to współrzędne jednorodne nie odpowiadają żadnemu punktowi w przestrzeni kartezjańskiej i mówimy, że takie współrzędne reprezentują punkt w nieskończoności.
Przykład
Współrzędne jednorodne:
(2, 3, 5, 1) , (4, 6, 10, 2) , (1, 1.5, 2.5, 0.5) wyznaczają ten sam punkt w trójwymiarowej przestrzeni kartezjańskiej.
Przekształcenia geometryczne – postać ogólna
Przekształcenia geometryczne definiujemy za pomocą macierzy transformacji. Dla punktu 𝑃 = (𝑃𝑥, 𝑃𝑦, 𝑃𝑧, 1) i przekształcenia 𝑇 uzyskujemy punkt 𝑃′ = (𝑃𝑥′, 𝑃𝑦′, 𝑃𝑧′, 1):
[ 𝑃𝑥′ 𝑃𝑦′ 𝑃𝑧′ 1
] = [
𝑇11 𝑇12 𝑇13 𝑇14 𝑇21 𝑇22 𝑇23 𝑇24 𝑇31 𝑇32 𝑇33 𝑇34
0 0 0 1
] [ 𝑃𝑥 𝑃𝑦 𝑃𝑦 1
]
Poniżej znajdują się macierze dla wybranych przekształceń: translacji, skalowania oraz rotacji.
Translacje
Macierz translacji (przesunięcia) o wektor 𝑢⃗ = [𝑢𝑥, 𝑢𝑦, 𝑢𝑧] :
𝑻(𝑢⃗ ) = [
1 0 0 𝑢𝑥 0 1 0 𝑢𝑦 0 0 1 𝑢𝑧
0 0 0 1
]
Uwaga: 𝑢𝑥 jest przesunięciem wzdłuż osi 𝑂𝑋, 𝑢𝑌 wzdłuż osi 𝑂𝑌, a 𝑢𝑍 wzdłuż osi 𝑂𝑍 .
2 Skalowanie
Macierz skalowania wzdłuż każdej osi ze współczynnikami skali dla każdej z nich:
𝑺(𝑠𝑥, 𝑠𝑦, 𝑠𝑧) = [
𝑠𝑥 0 0 0
0 𝑠𝑦 0 0 0 0 𝑠𝑧 0
0 0 0 1
]
Obroty
Macierze obrotu o kąt 𝜃 wokół osi 𝑂𝑋, 𝑂𝑌 oraz 𝑂𝑍 :
𝑹𝑿(𝜃) = [
1 0 0 0
0 cos(𝜃) −sin(𝜃) 0 0 sin(𝜃) cos(𝜃) 0
0 0 0 1
] , 𝑹𝒀(𝜃) = [
cos(𝜃) 0 sin(𝜃) 0
0 1 0 0
−sin(𝜃) 0 cos(𝜃) 0
0 0 0 1
] ,
𝑹𝒁(𝜃) = [
cos(𝜃) −sin(𝜃) 0 0 sin(𝜃) cos(𝜃) 0 0
0 0 1 0
0 0 0 1
]
Przykład
Figurę wyznaczoną przez wierzchołki 𝐴𝐵𝐶𝐷 obrócić wokół osi 𝑂𝑍 o kąt 𝜃 =𝜋6 . Wykonać ilustrację graficzną. Współrzędne wierzchołków są następujące: 𝐴 = (0, 0, 0), 𝐵 = (5, 0, 0), 𝐶 = (4, 0, 3), 𝐷 = (2, 0, 3.5).
Uwaga
Definiujemy dwie macierze: macierz wierzchołków 𝑽 i macierz krawędzi figury 𝑭. Przy czym macierz wierzchołków jest tylko macierzą pomocniczą, która ułatwi definiowanie macierzy krawędzi. W macierzy krawędzi podajemy ciąg wierzchołków wyznaczających kolejne krawędzie figury (można wielokrotnie przechodzić przez wierzchołki i krawędzie).
Dla ułatwienia zapisu punkty (wierzchołki figury) definiowane są w kolejnych wierszach macierzy 𝑽. Podobnie definiowana jest macierz krawędzi 𝑭. Następnie macierz krawędzi jest transponowana tak, aby punkty zapisane były w kolumnach i mogły być transformowane zgodnie z konwencją:
𝑷′= 𝑻 ∗ 𝑷
gdzie 𝑷 = [ 𝑥 𝑦 𝑧 1
] jest wierzchołkiem figury odczytanym z macierzy 𝑭 𝑇.
3
Do narysowania krawędzi figury wykorzystana jest funkcja plot3(x,y,z), która działa analogicznie do funkcji plot(x,y). Przy czym pozwala ona rysować obiekty w przestrzeni 3D – łączy odcinkami punkty zdefiniowane za pomocą wektorów współrzędnych x, y, z.
clf % clear figure
% wierzchołki figury (w kolejnych wierszach)
V = [0, 0, 0, 1; % A
5, 0, 0, 1; % B
4, 0, 3, 1; % C
2, 0, 3.5, 1]; % D
% definicja ciągu krawędzi figury
% rysunek jest tworzony poprzez podanie współrzędnych
% kolejnych wierzchołków: A B C D A
F = [V(1,:); V(2,:); V(3,:); V(4,:); V(1,:)];
F = F'; % transpozycja
% rysunek krawędzi
plot3(F(1,:), F(2,:), F(3,:), 'r') grid on
% kąt obrotu theta = pi/6;
% macierz transformacji (obrót wokół osi OZ) T = [cos(theta), -sin(theta), 0, 0 ;
sin(theta), cos(theta), 0, 0;
0, 0, 1, 0;
0, 0, 0, 1];
% transformacja współrzędnych wszystkich wierzchołków
% tworzących krawędzie figury F2 = T*F;
hold on
% rysunek krawędzi po transformacji plot3(F2(1,:), F2(2,:),F2(3,:), 'g')
axis([0,5,0,5,0,3.5]) % zakres osi OX, OY i OZ
axis equal
4 Wynik działania skryptu przedstawiony jest poniżej:
Zadania
Bazując na przedstawionym przykładzie wykonać poniższe zadania:
zad. 1.
Dana jest figura 𝐴𝐵𝐶𝐷𝐸:
𝐴 = (1, 1, 0), 𝐵 = (3, 2, 0), 𝐶 = (4, 1, 0), 𝐷 = (4, 4, 0), 𝐸 = (3, 4, 0).
Wykonać następujące operacje z zachowaniem ich kolejności:
- translacja figury w taki sposób, aby wierzchołek 𝐴 znalazł się w początku układu współrzędnych, a sama figura pozostała w płaszczyźnie 𝑧 = 0,
- obrót figury wokół osi 𝑂𝑋 o kąt 90°,
- przeskalowanie figury ze współczynnikiem 𝑠 = 1.5 (wzdłuż osi 𝑂𝑋 i 𝑂𝑍).
Narysować figurę po każdej operacji.
zad. 2.
Narysować czworościan o wierzchołkach 𝐴𝐵𝐶𝐷:
𝐴 = (0, 0, 0), 𝐵 = (2, 2, 0), 𝐶 = (0, 3, 0), 𝐷 = (0, 2, 2).
Wykonać trzykrotnie obrót o kąt 90° wokół osi 𝑂𝑌. Po każdym obrocie dorysować uzyskaną figurę.
5 zad. 3.
Wprowadzenie
Obrót o kąt 𝜑 wokół dowolnej osi przechodzącej przez początek układu współrzędnych 𝑂 = (0, 0, 0), której kierunek jest wyznaczony przez wektor jednostkowy 𝑛⃗ = [𝑎, 𝑏, 𝑐]
można zrealizować za pomocą macierzy transformacji:
𝑴 = [
𝑎2 (1 − cos 𝜑) + cos 𝜑 𝑎𝑏 (1 − cos 𝜑) − 𝑐 sin 𝜑 𝑎𝑐 (1 − cos 𝜑) + 𝑏 sin 𝜑 0 𝑎𝑏 (1 − cos 𝜑) + 𝑐 sin 𝜑 𝑏2 (1 − cos 𝜑) + cos 𝜑 𝑏𝑐 (1 − cos 𝜑) − 𝑎 sin 𝜑 0 𝑎𝑐 (1 − cos 𝜑) − 𝑏 sin 𝜑 𝑏𝑐 (1 − cos 𝜑) + 𝑎 sin 𝜑 𝑐2 (1 − cos 𝜑) + cos 𝜑 0
0 0 0 1]
Powyższą transformację można również zapisać:
𝑴 = [𝑹 𝟎 𝟎 1] gdzie:
𝑹 = [ 𝑎 𝑏
𝑐] [𝑎, 𝑏, 𝑐] (1 − cos 𝜑) + 𝚰 cos 𝜑 + [ 0 −𝑐 𝑏
𝑐 0 −𝑎
−𝑏 𝑎 0
] sin 𝜑
𝚰 - macierz jednostkowa
Zadanie
Wykonać pełny obrót ze skokiem co 10° punktu 𝑃 = (2, 2, 2) wokół osi wyznaczonej przez wektor 𝑎 = [2, 2, 1] i przechodzącej przez punkt 𝑆0 = (1, 1, 0). Narysować oś obrotu oraz wszystkie uzyskane punkty.
Wskazówki
a) Wektor 𝑎 = [2, 2, 1] należy unormować:
𝑛⃗ = 𝑎
‖𝑎 ‖= [23, 2 3, 13]
b) W celu skorzystania z podanej powyżej macierzy transformacji 𝑴 należy najpierw wykonać translację 𝑇𝑟 tak, aby punkt 𝑆0 znalazł się w początku układu współrzędnych, następnie wykonać właściwą transformację 𝑀, a na koniec translację odwrotną do translacji 𝑇𝑟. Transformacje można składać wykonując mnożenie macierzy transformacji:
𝑻 = 𝑻𝒓−1 𝑴 𝑻𝒓
6
c) Dla ułatwienia orientacji w trójwymiarowym układzie współrzędnych wyświetlanym w oknie graficznym można dodatkowo narysować wersory osi. Dla uproszczenia można pominąć groty strzałek i narysować tylko odcinki długości 1:
plot3([0 1], [0 0], [0 0], 'r'); % OX plot3([0 0], [0 1], [0 0], 'g') % OY plot3([0 0], [0 0], [0 1], 'b') % OZ