Elementy rysowania obiektów z użyciem kwadryk w bibliotekach GLU
Transkrypt
Elementy rysowania obiektów z użyciem kwadryk w bibliotekach GLU
Elementy rysowania obiektów z użyciem kwadryk w bibliotekach GLU Andrzej Kądzielawa Marzec 2012 1 Kwadryki Kwadrykami nazywamy powierzchnie, które są rozwiązaniem równania drugiego stopnia. W trzech wymiarach (x, y, z) można to sprowadzić do: Ax2 + By 2 + Cz 2 + Dxy + Exz + F yz + Gx + Hy + Iz + J = 0, (1) gdzie A, B, C, D, E, F, G, H, I, J ∈ R. Można w ten sposób opisać: 1. elipsoidę (szczególnym przypadkiem jest sfera) 2. hiperboloidy 3. paraboloidy 4. walce 5. stożki 6. płaszczyzny (Przykłady na en.wikipedia.org/wiki/Quadric). 2 Zastosowanie W OpenGL w bibliotece OpenGL Utility Library mamy możliwość łatwego rysowania kwadryk, a co za tym idzie. Sfer, walców, i dysków (co jest o tyle nietrywialne, że “ręczne“ rysowanie tych obiektów jest czasochłonne i wymaga optymalizacji). 2.1 Metoda Do narysowania objektu (powiedzmy sfery) musimy mieć przygotowaną kwadrykę. W tym celu tworzymy wskaźnik do kwadryki: GLUquadricObj * jakas_kwadryka = gluNewQuadric () ; 1 Następnie musimy określić styl rysowania. Mamy do wyboru GL FILL (wypełnienie kolorem), GL SILHOUETTE (sama siatka), czy GL POINTS (same punkty). Na nasze potrzeby wybieramy pełne wypełnienie. gluQuadricDrawStyle ( jakas_kwadryka , GL_FILL ) ; Aby narysować objekt musimy określić odpowiednie parametry. I tak: g l u S p h e r e ( G L U q u a d r i c O b j * j a k a s _ k w a d r y k a , G L d o u b l e p r o m i e n , G L i n t ←l i c z b a _ p u n k t o w _ n a _ r o w n o l e z n i k a c h , G L i n t ←liczba_punktow_na_poludnikach ) ; g l u C y l i n d e r ( G L U q u a d r i c O b j * j a k a s _ k w a d r y k a , G L d o u b l e ←p r o m i e n _ d o l n e j _ p o d s t a w y , G L d o u b l e p r o m i e n _ g o r n e j _ p o d s t a w y , ←G L d o u b l e w y s o k o s c , G L i n t l i c z b a _ p u n k t o w _ n a _ o b r e c z a c h , G L i n t ←liczba_punktow_na_wysokosciach ) ; g l u D i s k ( G L U q u a d r i c O b j * j a k a s _ k w a d r y k a , G L d o u b l e ←p r o m i e n _ w e w n w t r z n e j _ o b r e c z y , G L d o u b l e ←p r o m i e n _ z e w n w t r z n e j _ o b r e c z y , G L i n t l i c z b a _ p u n k t o w _ n a _ o b r e c z a c h , ←GLint liczba_petli_miedzy_obreczami ) ; Tak więc: gluSphere ( jakas_kwadryka ,10.0 ,100 ,100) ; narysuje kulę o promieniu 10.0 w punkcie (0, 0, 0) z 100 punktów na zarówno południkach, jak i równoleżnikach. Na sam koniec usuwamy kwadrykę: gluDeleteQuadric ( jakas_kwadryka ) ; Półprzepuszczalną niebieską kulkę narysujemy wywołując: GLUquadricObj * jakas_kwadryka = gluNewQuadric () ; gluQuadricDrawStyle ( jakas_kwadryka , GL_FILL ) ; glColor4f ( 0 . 0 , 0 . 0 , 1 . 0 , 0 . 5 ) ; gluSphere ( jakas_kwadryka ,10.0 ,100 ,100) ; gluDeleteQuadric ( jakas_kwadryka ) ; czerwony, ledwo widoczny cylinder (o dolnej podstawie na płaszczyźnie z = 0) wywołując: GLUquadricObj * jakas_kwadryka = gluNewQuadric () ; gluQuadricDrawStyle ( jakas_kwadryka , GL_FILL ) ; glColor4f ( 1 . 0 , 0 . 0 , 0 . 0 , 0 . 1 ) ; gluCylinder ( jakas_kwadryka ,10.0 ,10.0 ,5.0 ,100 ,100) ; gluDeleteQuadric ( jakas_kwadryka ) ; a zielony nietransparentny dysk (na płaszczyźnie z = 0) wywołując: GLUquadricObj * jakas_kwadryka = gluNewQuadric () ; gluQuadricDrawStyle ( jakas_kwadryka , GL_FILL ) ; glColor4f ( 0 . 0 , 1 . 0 , 0 . 0 , 1 . 0 ) ; gluDisk ( jakas_kwadryka ,0.0 ,10.0 ,100 ,100) ; gluDeleteQuadric ( jakas_kwadryka ) ; 2