Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
OpenGL - 2 díl Rotace objektů
3. srpna 2001, 00.00 | Pokračování seriálu o OpenGl. Dnes se budeme zabývat rotacemi objektů ve 3 prostoru.
Rotace objektů
Vítejte u druhého dílu povídání o OpenGL. Dnešní díl má název - Rotace objektů
Velice důležitým prvkem práce s prostorem po transformaci je rotace objektu. Provádí se obdobným způsobem jako transformace. Vezmeme počátek souřadnic a pootočíme ho podle některé ze souřadných os X,Y,Z o určitý úhel (viz obrázek):
Rotace počátku se provádí funkcí
glRotatef(uhel, 0.0f,1.0f, 0.0f);
Jak už první parametr napovídá, bude se jednat o úhel, o který chceme otáčet. Další parametry představují hodnoty x, y, z. Jsou to vektory od 0 do x, od 0 do y, od 0 do z. Takže zadáme-li hodnotu za x, budeme objekt podle osy x proti směru hodinových ručiček. Pokud zadáme hodnotu do y budeme rotovat objekt kolem osy y a nakonec pokud zadáme hodnotu do z, pootočíme s objektem kolem osy z.
Samozřejmě to lze kombinovat, takže pokud zadáme hodnotu do x i do y, tak se počátek pootočí zároveň kolem osy x, a zároveň kolem osy y.
Zkuste si přiložený příklad.
Narýsovaly jsme souřadné osy x, y, z a na osy xy jsme narýsovali obdelník. Vše ve trojím vyhotovení , pokaždé pootočené o jiný úhel . První není pootočen o žádný úhel. Druhý je pootočen o 30 stupňů podle osy x a třetí o 30 stupňů podle osy y.
|
Při každém kreslení obrazce nejprve vyresetujeme pohled na 0,0,0 posuneme počátek a otočíme o 30 stupňů. Jistě jste si už všimli, že při rotaci neotáčíme narýsovaným objektem, ale rotujeme počátek souřadnic (podobně jako glTranslatef). Z toho vyplívají velké možnosti pro manipulaci s objekty. V prvé řadě to znamená, že nemusíme otáčet pouze jedním objektem, ale dvěmi, třemi nebo celou scénou . No a za druhé podle toho, jak umístíme objekt do souřadného sytému, bude se otáčet. Například kolem své osy nebo kolem určitého bodu po kružnici.
Poznámka: OpenGL nenabízí konstrukci kružnice. A to pomocí funkcí sinus či kosinus. Hladkost kružnice je dána velikostí kroku ve stupních.
Typ čáry
Jistě jste si všimli, že jednotlivé obdelníky v prvním
příkladu jsou každé jinou čárou. Jak tedy na to? Velmi jednoduše. Nejprve aktivujeme
používání různých druhů čar:
glEnable(GL_LINE_STIPPLE);
No a teď již měníme typ čáry funkcí:
glLineStipple(1, 0xFFFF);
Podstatný je druhý parametr, kterým určíme čáru. Mohla by vám pomoci
jednoduchá tabulka::
plná čára | 0xFFFF |
čárkovaná - krátké | 0xF0F0 |
čárkovaná - dlouhé | 0xF00F |
tečkovaná | 0x8888 |
Tím se dostáváme k dalšímu příkladu, který je na stejné kopyto a uvádím ho jen pro názornost. jde o kvádr narýsovaný ze šesti obdelníkových stěn (kvádr jako samostatné těleso se podíváme v některém z dalších dílů). Kvádrem rotujeme pomocí voleb v menu.
Malý bonus na závěr
A pokračujeme vesele dál. Téma dnešního dílu už jsme vyčerpali, přesto se ještě podíváme na další způsob jak vytvořit OpenGL aplikaci a to sice jako čistou win32. Využijeme to do budoucna v dalších dílech seriálu a také je tento způsob použitelný také pro jiné překladače než C++ Builder. O co půjde? Naprogramujeme několik grafů funkcí ve tvaru z = f(x, y). Berte to spíše jako zajímavost, pro tentokrát bych netlačil příliš na pilu.
Program si stáhněte ve dvou verzích. Klasicky jak už jsme zvyklí a jako win32 aplikaci. Na první pohled poznáte rozdíl ve vykreslování. Zatímco jsme překreslování obrazu dosud vynucovali funkcí Invalidate();, mělo to za následek drobné vady na obrazu. Nyní použijeme tzv. double-buffering a překreslování bude naprosto čisté.
Popišme si jak to celé funguje. Jak už jsem napsal, jedná se o aplikaci win32. Zajím-li vás, jak se dělají win32 aplikace, podívejte se zde.
První věc, kterou nesmíme zapomenout je
vložit k programu knihovnu glaux.lib
USELIB("glaux.lib");
Takže jen velmi stručně (pro Builderáře), hlavní funkcí programu je jak víte
WinMain, ta vytvoří okno OpenGL funkcí CreateGLWindow, potom začne probíhat
smyčka zpráv. Smyčku zpráv vyhodnocujeme funkcí WndProc a pro nás je důležitá
obsluha zprávy
|
To jest, když je stisknuta některá klávesa, zaregistruje
se do pole bool keys[256]
hodnota true. To je vhodné pro
použití mimo funkci WndProc
.
OpenGL okno překresluje funkce DrawScene
a při změně velikosti
se o vše postará ReSizeGLScene
, vše je analogické jako při tvorbě
přes IDE, ale o všechno se musíte postarat sami (především o události).
Program ukončuje KillGLWindow
.
Když si zpětně procházím kód programu, některé funkce vypadají opravdu děsivě:
CreateGLWindow
. Na
rozdíl od programu, který jsme tvořili v IDE C++ Builderu, zde musíme registorovat
navíc vlastní okno window class. Program je navíc ošetřen pro přepnutí do fullscreenu
a přeložený exe soubor bude mnohem menší, protože nevkládáme knihovnu vcl.
Možná vás od tohoto způsobu odrazuje právě ta složitá kostra aplikace, přece
jen registrovat okno, vytvořit okno , zrušit okno a smyčka zpráv pojme hodně
řádek kódu (né zrovna přehledného). Mám jednoduchou radu, kostra aplikace se
většinou mnoho nemění, proto stačí kód (např. ten z příkladu) zkopírovat a posléze
přizpůsobit vlastním požadavkům. Oprostíte se od věcí, kterým nerozumíte nebo
se nemění.
V dalším díle se podíváme na světla, osvětlování objektů a letmo na knihovnu glut.
Obsah seriálu (více o seriálu):
- OpenGL - 1.díl Nastavení a jednoduché kreslení
- OpenGL - 2 díl Rotace objektů
- OpenGL v C++ Builderu (3.díl)
- OpenGL v C++ Builderu (4.díl)
- OpenGL v C++ Builderu (5.díl)
- OpenGL v C++ Builderu (6.díl)
- OpenGL -Jednoduché efekty 1
- OpenGL - 8. díl - 3D Font, JPEG textury
- OpenGL 9. díl - Bitmap Font
- OpenGL -10.díl Náčítání modelů ze souborů
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007