OpenGL - 2 díl Rotace objektů - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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.

    glLoadIdentity();                        // vynuluje počátek 
               
    glLineStipple(1, 0xffff);              // zmena typu čáry
    glTranslatef(-0.4, -0.5, -8);        
    glRotatef(30, 1.0, 0.0, 0);         // otočí počátek kolem osy x o 30 stupňů
    glBegin(GL_LINES); 
      glVertex3f( 0.0f, 0.0f, 0.0f); 
      glVertex3f(0.0f, 1.0f, 0.0f); 
      glVertex3f( 0.0f, 0.0f, 0.0f); 
      glVertex3f(0.0f,0.0f, 1.0f); 
      glVertex3f( 0.0f, 0.0f, 0.0f); 
      glVertex3f(1.0f,0.0f, 0.0f);
glEnd(); glLineStipple(1, 0xF00F);
glBegin(GL_QUADS); // obdelník glVertex3f( 0.1f, 0.1f, 0.0f); glVertex3f(0.6f, 0.1f, 0.0f); glVertex3f( 0.6f, 0.6f, 0.0f); glVertex3f(0.1f,0.6f, 0.0f); glEnd();

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.

zdroják!

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é.

Verze1, Verze2

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

case WM_KEYDOWN:  { 
  keys[wParam] = TRUE;
  return 0; 
}

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):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: