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:

0x01 graphic

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.