Professional Documents
Culture Documents
GK Lab09 PDF
GK Lab09 PDF
w Kielcach
Wydział Elektrotechniki, Automatyki i Informatyki
Grafika komputerowa
Podstawy grafiki komputerowej
Instrukcja laboratoryjna 9
„Przekształcenia geometryczne 3D
i obserwator”
Przygotowali:
mgr inż. Paweł Pięta
mgr inż. Daniel Kaczmarski
dr inż. Grzegorz Łukawski
Kielce, 2021
1 Wstęp
Celem zajęć jest omówienie podstawowych przekształceń geometrycznych wykonywa-
nych w przestrzeni trójwymiarowej, które są wykorzystywane w grafice komputerowej,
a następnie wdrożenie tych transformacji w silniku gry.
2 Przekształcenia geometryczne 3D
Notacja macierzowa:
X2 = P ∗ X1
x
1
x
2
y1 y2
X1 = X2 =
z1 z2
1 1
2
Obrót względem dowolnej osi można (częściowo) zrealizować przez rozkład na obroty
cząstkowe wokół osi X, Y i Z.
#include <glm/gtx/transform.hpp>
glm::rotate(kąt_rad, oś_obrotu)
glm::scale(wektor)
glm::translate(wektor)
Każda z powyższych funkcji posiada wersję z macierzą jako argument – kolejne przekształ-
cenie „dokładane” jest (przez mnożenie) do przekazanej macierzy:
glm::rotate(matX, ...)
glm::scale(matX, ...)
glm::translate(matX, ...)
kąt_rad = glm::radians(stopnie)
3
3.2 Składanie i realizacja transformacji
Składanie transformacji realizowane jest przez mnożenie macierzy, które odbywa się
z wykorzystaniem przeciążonego operatora *, np.:
// Transformacje:
glm::mat4 MatJ2 = glm::scale(glm::vec3(-1));
glm::mat4 MatT = glm::translate(glm::vec3(0, 2, 0));
// Złożenie transformacji:
glm::mat4 MatX = MatT * MatJ2;
// Transformacja punktów:
glm::vec4 p1a = MatX * p1;
glm::vec4 p2a = MatX * p2;
glm::vec4 p3a = MatX * p3;
// Wyświetlenie:
cout << "P1a: x=" << p1a.x << "y=" << p1a.y << endl;
cout << "P2a: x=" << p2a.x << "y=" << p2a.y << endl;
cout << "P3a: x=" << p3a.x << "y=" << p3a.y << endl;
// Wynik:
P1a: x=5 y=0
P2a: x=-1 y=-3
P3a: x=-1 y=0
4
4 Transformacje przestrzeni w OpenGL
Transformacje przestrzeni to podstawowy mechanizm wykorzystywany w OpenGL do
budowania sceny. Aby ułożyć obiekty (prymitywy) w scenę, należy je odpowiednio „po-
układać”. Zagadnienie to zostało zobrazowane na rysunku 1.
• macierz modelu (ang. model matrix) – reprezentuje transformacje obiektu, jego po-
łożenie w przestrzeni 3D i animację ruchu,
• macierz widoku (ang. view matrix) – odpowiada za położenie kamery,
• macierz rzutowania (ang. projection matrix) – odpowiada za rzutowanie sceny trój-
wymiarowej na płaszczyznę ekranu.
glMatrixMode(GLenum mode);
5
• GL_TEXTURE – macierz tekstur,
• GL_COLOR – macierz kolorów.
Klasa mat4 z biblioteki GLM stosuje dokładnie taką samą konwencję. Pozwala to na
bezpośrednie wygenerowanie macierzy w postaci tabeli i przekazanie jej do OpenGL.
Bezpośrednie operacje na macierzach dotyczą aktywnej macierzy, wybranej przez ostatnie
wywołanie funkcji glMatrixMode():
#include <glm/gtc/type_ptr.hpp>
glm::mat4 Mat;
glm::value_ptr(Mat);
// Macierz translacji:
glm::mat4 MatM = glm::translate(glm::vec3(0, 0, -300));
glLoadMatrixf(glm::value_ptr(MatM));
6
// Wersja zwięzła:
glLoadMatrixf(glm::value_ptr(glm::mat4(1.0f)));
6 Położenie obserwatora
Pierwszy sposób polega na pozostawieniu obserwatora w punkcie (0, 0, 0) i odsunięciu
środka sceny na wymaganą odległość. Zagadnienie to zostało zobrazowane na rysunku 2.
W tym przypadku funkcja rysująca rozpoczyna się od translacji wzdłuż osi Z na odległość
rzutowania, np.:
gdzie:
7 Transformacje w OpenGL
Sekcja zawiera kilka przykładów przekształceń geometrycznych 3D w OpenGL. Więcej
przykładów transformacji znajduje się w prezentacjach z wykładu.
7
Rysunek 3: Położenie obserwatora – sposób 2
7.1 Przykład 1
Przykład 1 został zobrazowany na rysunku 4.
8
7.2 Przykład 2
Prosty model Układu Słonecznego, gdzie:
glColor3f(1, 1, 0);
(1) glutSolidSphere(5, 12, 12);
(2) MatM = rotate(MatM, alfa, vec3(0, 1, 0));
(3) MatM = translate(MatM, vec3(40, 0, 0));
(3) glLoadMatrixf(value_ptr(MatM));
(3) glColor3f(0, 0, 1);
(4) glutSolidSphere(3, 12, 12);
(5) MatM = rotate(MatM, beta, vec3(0, 1, 0));
(6) MatM = translate(MatM, vec3(10, 0, 0));
(6) glLoadMatrixf(value_ptr(MatM));
(6) glColor3f(0.5, 0.5, 0.5);
(7) glutSolidSphere(1, 12, 12);
9
7.3 Przykład 3
Przykład 3 został zobrazowany na rysunku 6.
// Animacja (lewo/prawo):
MatM = glm::rotate(MatM, glm::radians(angle), glm::vec3(0, 1, 0));
8 Zadania
1. Zaimplementuj klasę reprezentującą obserwatora, która umożliwi łatwe konfiguro-
wanie i zmianę pozycji kamery w scenie 3D.
10
Rysunek 6: Graficzne przestawienie przykładu 3
11