Grafika Komputerowa
Prowadzący: dr inż. W. Sulej
Autor: Teodor Kulej
Grupa: I8Y1S1
Zadanie polegało na napisaniu programu rysującego zadany przez prowadzącego obiekt w przestrzeni 3D za pomocą biblioteki OpenGl i prymitywów dostarczonych przez nią. Zadana bryła miała posiadać możliwość ruchu, zgodną ze szczegółowymi wytycznymi.
Bryłą, którą modelowałem był bojowy wóz piechoty. Miał posiadać możliwość obrotu wieżyczki i zmiany kątu nachylenia lufy.
Wykorzystywane funkcje:
Polecenia operujące na macierzy przekształceń:
glPushMatrix() – Ta funkcja odkłada na stos aktualną macierz przekształceń geometrycznych
glPopMatrix() – zdejmuje ze stosu odłożoną wcześniej macierz przekształceń.
glScalef(x, y, z) – modyfikuje macierz przekształceń tak, aby tworzona bryła była przeskalowana o x, y, z wzdłóż osi OX, OY, OZ
glTranslatef(x, y, z) – modyfikuje macierz tak, aby tworzona bryła znajdowała się w punkcie przesuniętym o x, y, z względem poprzedniego punktu odniesienia
glRotate(a, x, y, z) – obraca układ odniesienia o kąt a na współrzędnych tych osiach, których parametry x, y, z nie są zerowe. Obrót następuje przeciwnie do ruchu wskazówek zegara
Polecenia rysujące prymitywy
GluCylinder(kwadryka, promienPodstawy1, promienPodstawy2, wysokosc, poludniki, rownolezniki)
gluDisk(kwadryka, promien1, promien2, poludniki, rownolezniki)
gluWireCube(dlugoscBoku)
Te funkcje rysują odpowiednio:
Cylinder ścięty o zadanym promieniu podstawy górnej i dolnej, wysokości i odpowiedniej liczbie podziałów pionowych i poziomych
Dysk ze środkiem w punkcie odniesienia, zadanym promieniem zewnętrznym i wewnętrznym oraz odpowiedniej liczbie podziałów
Sześcian o zadanej długości boku
Kod rysujący bojowey wóz piechoty:
//podwozie
glPushMatrix();
glTranslatef(0.0,1.2,20.0);
glScalef(10,1.4,2);
glutWireCube(1);
glPopMatrix();
//nadwozie
glPushMatrix();
glTranslatef(0.0,2.3,20.0);
glScalef(10,0.8,4);
glutWireCube(1);
glPopMatrix();
//koła
glPushMatrix();
glRotatef(0, 1, 0, 0);
glTranslatef(-3,0.5,21);
gluCylinder(quadr, 1.0, 1.0, 1.0, 10, 4);
glTranslatef(0.0, 0.0, 1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glTranslatef(0.0, 0.0,-1);
gluDisk(quadr, 0.0, 1.0, 2, 2);
glPopMatrix();
glPushMatrix();
glRotatef(0, 1, 0, 0);
glTranslatef(3,0.5,21);
gluCylinder(quadr, 1.0, 1.0, 1.0, 10, 4);
glTranslatef(0.0, 0.0, 1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glTranslatef(0.0, 0.0,-1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glPopMatrix();
glPushMatrix();
glRotatef(0, 1, 0, 0);
glTranslatef(-3,0.5,18);
gluCylinder(quadr, 1.0, 1.0, 1.0, 10, 4);
glTranslatef(0.0, 0.0, 1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glTranslatef(0.0, 0.0,-1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glPopMatrix();
glPushMatrix();
glRotatef(0, 1, 0, 0);
glTranslatef(3,0.5,18);
gluCylinder(quadr, 1.0, 1.0, 1.0, 10, 4);
glTranslatef(0.0, 0.0, 1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glTranslatef(0.0, 0.0,-1);
gluDisk(wieza, 0.0, 1.0, 2, 2);
glPopMatrix();
//wieza
glPushMatrix();
glRotatef(-90, 1, 0, 0);
glTranslatef(0,-20,2.7);
gluCylinder(quadr, 2.0, 1.0, 1.1, 10, 4);
glTranslatef(0.0, 0.0, 1.1);
gluDisk(wieza, 0.0, 1.0, 10, 4);
glPopMatrix();
//lufa
glPushMatrix();
glRotatef(90,0,1,0);
glTranslatef(-20,3.4,0);
gluCylinder(quadr, 0.15, 0.15, 4.5, 10, 4);
glPopMatrix();
Powyższy kod nie jest kodem napisanym w trakcie ćwiczeń labolatoryjnych, a jedynie otworzonym jego odpowiednikiem, ze względu na śmierć używanego przeze mnie nośnika danych I niemożność odzyskania oryginalnego kodu.
Ze względu na ograniczony czas trwania ćwiczeń i problemy z uzyskaniem dynamicznych przekształceń, nie udało mi się zrealizować całego zadania.
Wnioski:
Rysowanie brył przebiega w sposób bardzo podobny. Następuje odłożenie na stos aktualnego stanu macierzy przekształceń, ustawienie układu odniesienia w odpowiedni stan, narysowanie bryły i przywrócenie pierwotnego stanu macierzy przekształceń. Ten sposób jest wydajny obliczeniowo i wygodny dla programisty, gdyż nie wymaga przeliczania położenia kolejnych punktów, uwzględniania skalowania, obrotu czy translacji. Stosując jednak tę metodę należy pamiętać, że przekształcenia odbywają się nie na bryle, a na „świecie” w którym ta bryła jest tworzona.
Modelowanie w ten sposób bardziej złożonych i realistycznie wyglądających brył, w szczególności odpowiadającym obiektom organicznym, niezawierających w sobie graniastosłupów czy kul może być jednak bardzo kłopotliwe.
Przykładowy render: