funkcji glNormal() i glVertex() dla wierzchołków wskazywanych w jej intensji (listing 5...

Linki


» Dzieci to nie książeczki do kolorowania. Nie da siÄ™ wypeÅ‚nić ich naszymi ulubionymi kolorami.
»
Tworząc kod obsługi zasad biznesowych dobrą praktyką jest tworzenie funkcji obsługi wszystkich zasad...
»
Mazouje gentis sua persuasione princeps existebat et signiier, a zatem dopiero po jegoœmierci istnia³ czyli funkcjonowa³ (existebat) z w³asnego przekonania, a wiêc...
»
W ostatnich latach pojawi³o siê kilka inicjatyw odbudowy obiektu, b¹dŸ z przywróceniem pierwotnych funkcji, b¹dŸ jako schroniska turystycznego...
»
Nikt nie mo¿e ponosiæ ujemnych nastêpstw z powodu przynale¿noœci do zwi¹zku zawodowego, pozostawania poza nim albo wykonywania funkcji zwi¹zkowej...
»
dwóch faktach: mamy pojęcie funkcji ciągłych oraz pojęcie nieskończoności...
»
funkcję wykonają za parę rupii miejscowi marynarze, my zaś jedziemy autem Husseina dojakiegoś angielskiego inżyniera, prezesa lokalnego klubu jachtowego,...
»
Przy takim wyodrębnieniu funkcji bibulastych i oddaniu ich w ręce rzeczywistych niewolników bibuły znikać też musi stopniowo i przygodność, wypadkowość w...
»
PrintPreviewDialog udostępnia wiele funkcji, które pozwalają użytkownikowi na powięk-szenie, przewijanie i zmienianie stron podglądanego dokumentu...
»
Słowa kluczowe od A do Z25Modyfikator __cdecl należy umieścić przed nazwą zmiennej lub funkcji...
»
Więcej informacji na temat funkcji BitLocker...

Dzieci to nie książeczki do kolorowania. Nie da się wypełnić ich naszymi ulubionymi kolorami.

7).
Listing 5.7. Metoda getGLDefinition() klasy MyGLtriangle.
void MYGLtriangle : : g e t G L D e f i n i t i o n ( void ) {
2
g l N o r m a l 3 f ( n . x , n . y , n . z ) ;
g l V e r t e x 3 f ( v1−>x , v1−>y , v1−>z ) ;
4
g l V e r t e x 3 f ( v2−>x , v2−>y , v2−>z ) ;
g l V e r t e x 3 f ( v3−>x , v3−>y , v3−>z ) ;
6
}
Wracamy do opisu modelu. Zakładamy, że obie boczne ściany będą iden-
tyczne, płaskie, stąd wniosek, że trójkąty, z których je zbudujemy różnić
tylko się będą orientacją, ponieważ chcemy zachować poprawne oświetlenie
na zewnątrz. Połączy jest podłoga, ściana przednia, tylna i dach, które będą
wymodelowane jako jeden, ciągły pas.
Planowana tesselacja przedstawiona jest na rysunku 5.10 wraz z nu-
merami poszczególnych wierzchołków. Jeżeli przyjrzymy się teraz kodowi
74
5. Macierze i przekształcenia geometryczne
funkcji z listingu 5.8, to znajdziemy tam tablicę v2d, która zawiera opis
współrzędnych kolejnych wierzchołków, które zostaną wykorzystane do roz-
pięcia trójkątów ścian bocznych. Składowe współrzędnych są dwie, trzecia
będzie dodawana w momencie definiowania konkretnych ścian (patrz pętla
w liniach od 14 do 17).
Tablica ts2d zawiera indeksy wierzchołków dla kolejnych trójkątów ścia-
ny, a tr2d analogicznie dla podłogi i dachu. w oparciu o te dane dokonana
zostanie generacja odpowiednich wartości dla zbiorczych tablic wierzchoł-
ków i trójkątów. Jest to jedna z możliwości, ponieważ analogiczny efekt
można otrzymać bez użycia prezentowanych klas, co oczywiście komplikuje
wyliczanie normalnych, jak i opierajÄ…c na rozbudowanych klasach i listach
standardowej biblioteki szablonów C++ (STL).
Rysunek 5.10. Indeksy wierzchołków i tesselacja ściany bocznej nadwozia modelu.
Listing 5.8. Funkcja opisujÄ…c kabinÄ™ Forda T.
void drawBody ( void ) {
2
GLdouble v2d [ 9 ] [ 2 ] =
{ { 0 . 0 ,
0 . 0 } ,
{ 9 . 0 ,
0 . 0 } ,
{ 1 1 . 0 ,
3 . 0 } ,
4
{ 1 1 . 0 ,
7 . 5 } , { −0.5 , 7 . 5 } , { −0.5 , 7 . 0 } ,
{ 9 . 0 ,
7 . 0 } ,
{ 9 . 0 ,
4 . 0 } ,
{ 0 . 0 , 4 . 0 }
} ;
6
GLbyte t s 2 d [ 7 ] [ 3 ] = { { 0 , 1 , 8 } , { 1 , 2 , 8 } ,
{ 2 , 7 , 8 } , { 2 , 3 , 7 } , { 3 , 6 , 7 } ,
8
{ 3 , 4 , 6 } , { 4 , 5 , 6} } ;
GLbyte t r 2 d [ 7 ] = { 8 , 0 , 1 , 2 , 3 , 4 , 5 } ;
10
MYGLvertex v [ 1 8 ] ;
12
MYGLtriangle t [ 2 6 ] ;
5.10. Normalne
75
14
f o r ( i n t i =0; i <9; i ++) {
v [ i ] . s e t V e r t e x ( v2d [ i ] [ 0 ] , v2d [ i ] [ 1 ] ,
3 . 5 ) ;
16
v [ i + 9 ] . s e t V e r t e x ( v2d [ i ] [ 0 ] , v2d [ i ] [ 1 ] ,
−3.5) ;
}
18
f o r ( i n t i =0; i <7; i ++) {
20
t [ i ] . s e t T r i a n g l e (&v [ t s 2 d [ i ] [ 0 ] ] ,
&v [ t s 2 d [ i ] [ 1 ] ] , &v [ t s 2 d [ i ] [ 2 ] ] ) ;
22
t [ i + 7 ] . s e t T r i a n g l e (&v [ t s 2 d [ i ] [ 2 ] + 9 ] ,
&v [ t s 2 d [ i ] [ 1 ] + 9 ] , &v [ t s 2 d [ i ] [ 0 ] + 9 ] ) ;
24
}
26
f o r ( i n t i =0; i <6; i ++) {
t [ i + 1 4 ] . s e t T r i a n g l e (&v [ t r 2 d [ i ] + 9 ] ,
28
&v [ t r 2 d [ i + 1 ] + 9 ] , &v [ t r 2 d [ i ] ] ) ;
t [ i + 2 0 ] . s e t T r i a n g l e (&v [ t r 2 d [ i ] ] ,
30
&v [ t r 2 d [ i + 1 ] + 9 ] , &v [ t r 2 d [ i + 1 ] ] ) ;
}
32
g l P u s h M a t r i x ( ) ;
34
g l B e g i n (GL_TRIANGLES) ;
f o r ( i n t i =0; i <26; i ++)
36
t [ i ] . g e t G L D e f i n i t i o n ( ) ;
glEnd ( ) ;
38
g l P o p M a t r i x ( ) ;
}
Do kabiny należy dodać jeszcze cztery słupki, co jest banalne i sprowa-
dza się do odpowiednio przetransformowanych sześcianów wziętych prosto
z GLUT (listing 5.9).
Listing 5.9. Funkcja opisująca słupki w kabinie Forda T.
1
void d r a w S t i c k s ( void ) {
g l P u s h M a t r i x ( ) ;
3
g l T r a n s l a t e f ( 0 . 2 5 ,
3 . 2 5 ,
5 . 5 ) ;
g l S c a l e f ( 0 . 5 ,
0 . 5 ,
3 . 0 ) ;
5
g l u t S o l i d C u b e ( 1 . 0 ) ;
g l P o p M a t r i x ( ) ;
7
g l P u s h M a t r i x ( ) ;
9
g l T r a n s l a t e f ( 0 . 2 5 ,
−3.25 , 5 . 5 ) ;
g l S c a l e f ( 0 . 5 ,
0 . 5 ,
3 . 0 ) ;
11
g l u t S o l i d C u b e ( 1 . 0 ) ;
g l P o p M a t r i x ( ) ;
13
g l P u s h M a t r i x ( ) ;
15
g l T r a n s l a t e f ( 5 . 2 5 ,
3 . 2 5 ,
5 . 5 ) ;
g l S c a l e f ( 0 . 5 ,
0 . 2 5 ,
3 . 0 ) ;
17
g l u t S o l i d C u b e ( 1 . 0 ) ;
76
5. Macierze i przekształcenia geometryczne
g l P o p M a t r i x ( ) ;
19
g l P u s h M a t r i x ( ) ;
21
g l T r a n s l a t e f ( 5 . 2 5 ,
−3.25 , 5 . 5 ) ;
g l S c a l e f ( 0 . 5 ,
0 . 2 5 ,
3 . 0 ) ;
23
g l u t S o l i d C u b e ( 1 . 0 ) ;
g l P o p M a t r i x ( ) ;
25
}
Maska silnika składa się z dwóch odpowiednio przekształconych sześcia-
nów, przy czym jej górna część została najpierw obrócona o 45 stopni po
czym przeskalowana z różnymi wartościami współczynników dla każdego
z kierunków, co spowodowało, że jedna ze ścian stała się rombem. Jeżeli
chcemy, aby dla tych elementów prawidłowo były obliczane normalne, ko-
nieczne jest użycie glEnable(GL NORMALIZE).
Listing 5.10. Funkcja opisujÄ…ca maskÄ™ Forda T.
1
\ void drawEngine ( void ) {
g l P u s h M a t r i x ( ) ;
3
g l T r a n s l a t e f ( − 2 . 0 , 0 . 0 ,
1 . 5 ) ;
g l S c a l e f ( 5 . 0 ,
4 . 0 ,
3 . 0 ) ;
5
g l u t S o l i d C u b e ( 1 . 0 ) ;
g l P o p M a t r i x ( ) ;
7
g l P u s h M a t r i x ( ) ;
9
g l T r a n s l a t e f ( − 2 . 0 , 0 . 0 ,
1 . 5 ) ;
g l S c a l e f ( 5 . 0 ,
4 . 0 ,
3 . 0 ) ;
11
g l u t S o l i d C u b e ( 1 . 0 ) ;
g l P o p M a t r i x ( ) ;
13
g l P u s h M a t r i x ( ) ;
15
g l T r a n s l a t e f ( − 2 . 0 , 0 . 0 ,
3 . 0 ) ;
g l S c a l e f ( 5 . 0 ,
2 . 8 ,
1 . 0 ) ;
17
g l R o t a t e f ( 4 5 , 1 , 0 , 0 ) ;
g l u t S o l i d C u b e ( 1 . 0 ) ;
19
g l P o p M a t r i x ( ) ;
}
Do kompletu pozostało zamodelowanie świateł, co można praktycznie
zostawić bez komentarza, bo kod za to odpowiedzialny jest prosty i, o ile

Powered by MyScript