Ćwiczenie 4
Temat: Przekształcenia geometryczne w przestrzeni 3D
Pytanie 32 (przy tablicy):
Przekształcenia geometryczne w przestrzeni 3D
Pytanie XX (przy tablicy):
Omówić działania na stosie macierzowym
Różne modele stosów wybór aktywnego stosu macierzowego
macierzowych w OpenGL: (uaktywnienie tylko 1 z 3)
Modelowania glMatrixMode(glModelView)
Rzutowania glMatrixMode(glProjection)
Texturowania glMatrixMode(glTexture)
|
|
1 |
|
1 |
2 |
|
1 |
|
2 |
3 |
|
2 |
|
3 |
4 |
|
3 |
|
4 |
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
Zadanie 1
Wykorzystując funkcję glutSolidCube oraz funkcje działające na stosie macierzy modelowania napisać fragment programu odpowiedzialny za utworzenie obiektu (Wieża), którego rzuty przedstawiono na rysunkach.
bok podstawy:
=4.23
Wieża |
void RysujScene(void) { // Rysowanie podstawy wieży glColor3f(1.0, 0.0, 0.0); glPushMatrix(); glTranslatef(0.0, 5.0, 0.0);//początek układu w środku prostopadłościanu glRotatef(45.0, 0, 1, 0) glScalef(4.23, 10.0, 4.23); glutSolidCube(1); glPopMatrix();
// Rysowanie nadbudówki glColorf(0.0, 1.0, 0.0); glPushMatrix(); glTranslatef(0.0, 11.5, 0.0);// bo 10 + 1.5 glScalef(8.0, 3.0, 8.0); glutSolidCube(1); glPopMatrix();
// Rysowanie wieżyczek (translacje wykonywane są w przeskalowanym układzie współrzędnych glColorf(0.0, 0.0, 1.0); glPushMatrix(); glScalef(2.0, 2.0, 2.0); glTranslatef(1.5, 7.0, -1.5);// nie 3.0, 14.0, -3.0 bo przeskalowano //wcześniej glutSolidCube(1); glTranslatef(-3.0, 0.0, 0.0);// glutSolidCube(1); glTranslatef(0.0, 0.0, 3.0); // glutSolidCube(1); glTranslatef(3.0, 0.0, 0.0); // glutSolidCube(1);
glPopMatrix(); }
|
Zadanie 2
Wykorzystując funkcję glutWireSphere oraz funkcje działające na stosie macierzy modelowania napisać fragment programu odpowiedzialny za dynamiczne tworzenie sceny przedstawiającej układ słoneczny złożony ze słońca oraz jednej planety i jej księżyca wiedząc, że:
promień słońca = 5;
promień planety = 2;
promień księżyca = 0.5;
promień orbity planety = 20;
promień orbity księżyca = 5;
prędkość kątowa planety = 0.25 stopnia/klatkę (kierunek CW [-] Clock Wise - zgodnie ze wskazówkami zegara);
prędkość kątowa księżyca = 0.5 stopni/klatkę (kierunek CCW [+] Current Clock Wise - przeciwnie do wskazówek zegara);
spin planety = 1 stopień na klatkę (CCW [+]);
obie orbity leżą w płaszczyźnie xz.
Układ słoneczny |
void RysujScene(void) { // Przygotowanie stosu macierzy modelowania glPushMatrix();
// rysowanie słońca glColor3f(1.0, 1.0, 0.0); glPushMatrix(); glRotatef(-90.0, 1, 0, 0);// bieguny były w osi z glScalef(5.0, 5.0, 5.0); glutWireSphere(1.0, 20.0,20.0); glPopMatrix();
|
// Rysowanie planety okrążającej słońce po orbicie o promieniu 20 z prędkością // 1 stopień na klatkę (kierunek CW) glColorf(0.0, 1.0, 0.0); glRotatef(rotacjaPlanety, 0, 1, 0); glTranslatef(0.0, 0.0, 20.0); glPushMatrix(); glRotatef(spinPlanety, 0, 1, 0); glRotatef(-90.0, 1, 0, 0); glScalef(2.0, 2.0, 2.0); glutWireSphere(1.0, 20.0,20.0); glPopMatrix();
// Rysowanie księżyca okrążającego planetę po orbicie o promieniu 5 z prędkością // 5 stopni na klatkę (kierunek CCW) glColorf(0.0, 0.0, 1.0); glRotatef(rotacjaKsiezyca, 0, 1, 0); glRotatef(-90.0, 1, 0, 0); glTranslatef(5.0, 0.0, 0.0); glScalef(0.5, 0.5, 0.5); glutWireSphere(1.0, 20, 20);
// Posprzątanie na stosie macierzy modelowania glPopMatrix(); }
//korekcja zmiennych (indeksów)w pętli RysujScene rotacjaPlanety-=0.25 //(rotacjaPlanety=rotacjaPlanety-0.25) spinPlanety+=1 //(spinPlanety++) rotacjaKsiezyca+=0.5 |
Grafika komputerowa - Ćwiczenia
I_Ćwiczenia_4_zadania Strona 4
Grafika komputerowa - Ćwiczenia
6 semestr III rok studiów dziennych
I_Ćwiczenia_4_zadania Strona 1
Ten sam układ współrzędnych
To można modyfikować a na końcu wyrysować
PushMatrix()
PopMatrix()
Kolejne macierze układów współrzędnych
z
y
6
2
2
2
1
2
x
x
8
3
4
3
10
Uwaga: Zadanie realizowane jest od stanu początkowego - zastanego:
po załadowaniu układu jednostkowego (prawoskrętnego, obserwator w środku)
po zdefiniowaniu i wykonaniu rzutu perspektywicznego (obserwator przeniesiony)
po ustawieniu aktywnego stosu macierzowego przeznaczonego do modelowania
8
z
y
x