WOJSKOWA AKADEMIA TECHNICZNA
Grafika komputerowa
Laboratoria numer 2
Temat: Modelowanie prostych obiektów przy pomocy prymitywów.
Rafał Łańcucki
I9X5S1
Treść zadań:
1/3 elipsoidy w trybie GL_QUADS o półosiach a = 3, b = 5, c = 2 i środku w punkcie (0, 0, 0),
Rozwiązania zadań:
void RysujSzescian(double r, double nh, double nv)
{
// półosie elipsoidy
Int a = 3;
Int b = 5;
Int c = 2;
double dAlfa,dA,dT;
int i, j;
dAlfa = 360.0L/(double)nh;
dA = 360.0L / (double)nh;
dT = 90.0L/ (double)nv;
// Sciany boczne
for (j=-nv; j<=nv-1; j++) {
glBegin(GL_QUADS);
for( i = 1; (i-1)*dAlfa <= 360.0L*cut; i++) {
glVertex3f(r*a*cos(DEG2RAD(j*dT))*cos(DEG2RAD(i*dA)),
r*b*cos(DEG2RAD(j*dT))*sin(DEG2RAD(i*dA)),
r*c*sin(DEG2RAD(j*dT)));
glVertex3f(r*a*cos(DEG2RAD((j+1)*dT))*cos(DEG2RAD(i*dA)),
r*b*cos(DEG2RAD((j+1)*dT))*sin(DEG2RAD(i*dA)),
r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(r*a*cos(DEG2RAD((j+1)*dT))*cos(DEG2RAD((i+1)*dA)),
r*b*cos(DEG2RAD((j+1)*dT))*sin(DEG2RAD((i+1)*dA)),
r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(r*a*cos(DEG2RAD(j*dT))*cos(DEG2RAD((i+1)*dA)),
r*b*cos(DEG2RAD(j*dT))*sin(DEG2RAD((i+1)*dA)),
r*c*sin(DEG2RAD(j*dT)));
}
glEnd();
//sciany wyciecia
glBegin(GL_QUADS);
glVertex3f(r*a*cos(DEG2RAD(j*dT))*cos(DEG2RAD(dA)),
r*b*cos(DEG2RAD(j*dT))*sin(DEG2RAD(dA)),
r*c*sin(DEG2RAD(j*dT)));
glVertex3f(r*a*cos(DEG2RAD((j+1)*dT))*cos(DEG2RAD(dA)),
r*b*cos(DEG2RAD((j+1)*dT))*sin(DEG2RAD(dA)),
r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(0.0, 0.0, r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(0.0, 0.0, r*c*sin(DEG2RAD(j*dT)));
glVertex3f(r*a*cos(DEG2RAD(j*dT))*cos(DEG2RAD(i*dA)),
r*b*cos(DEG2RAD(j*dT))*sin(DEG2RAD(i*dA)),
r*c*sin(DEG2RAD(j*dT)));
glVertex3f(r*a*cos(DEG2RAD((j+1)*dT))*cos(DEG2RAD(i*dA)),
r*b*cos(DEG2RAD((j+1)*dT))*sin(DEG2RAD(i*dA)),
r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(0.0, 0.0, r*c*sin(DEG2RAD((j+1)*dT)));
glVertex3f(0.0, 0.0, r*c*sin(DEG2RAD(j*dT)));
glEnd();
}
}
Gdzie : r- promień, nh - ilość południków, nv - ilość równoleżników.
Pierwsza, główna pętla for reguluje nam ilość równoleżników w figurze, oraz ich promienie.
Pętla wewnętrzna rysuje nam punkty składające się w południki. Ograniczenie fora wewnętrznego `<= 360.0L*cut' zapewnia wycinek elipsoidy zależny od zmiennej cut, która w danym przypadku ustawiona jest na poziomie 0.33. Ściany wycięcia ustawione są odpowiednio: 1. w miejscu od którego zaczynamy budowanie figury, 2. uzależniona jest od `i' które w tym momencie kodu posiada stałą wartość po ostatnim obrocie fora, co ustawia ją równo z ostatnim powstałym południkiem.
Grafika poglądowa:
Za zmianę właściwości figury odpowiadał kod:
{
switch(klawisz)
{
case '1':
Pion=(Pion<42) ? Pion+1 : 42;
break;
case 'q':
Pion=(Pion>21) ? Pion-1 : 21;
break;
case 'w':
Poz=(Poz>7) ? Poz-1 : 7;
break;
case '2':
Poz=(Poz<14) ? Poz+1 : 14;
break;
case '3':
cut =(cut <=0.3) ? cut+0.05 : 0.33;
break;
case 'e':
cut =(cut >=0.09) ? cut -0.05 : 0.03;
break;
}
if (klawisz == 27) exit(0);
}
Całość głownie opiera się na switch'u, gdzie zwiększane są zmienne: Pion - ilość południków, Poziom - ilość równoleżników, oraz zmienna cut, która pozwala nam `rysować' kolejne poziomy figury. Dodatkowo wprowadzono blokadę na wprowadzenie zbyt małej lub dużej liczby podziałów bryły.
Wnioski:
Postawiony cel zadania został zrealizowany w pełni poprawnie. Tryb modelowania GL_QUADS jak widać pozwalał na osiągnięcie zamierzonego celu.