[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68470)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78806)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • OpenGL - 2 díl Rotace objektů
    Pokračování seriálu o OpenGl. Dnes se budeme zabývat rotacemi objektů ve 3 prostoru.
    OpenGL
    Předchozí díl: OpenGL - 1.díl Nastavení a jednoduché kreslení

    Následující díl: OpenGL v C++ Builderu (3.díl)
    Autor: Michal Svoboda
    Rubrika: C/C++
    Publikováno: 03.08. 2001
     Tisk článku
    Poslat odkaz emailem
     

    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.


    Zpět na začátek stránky

    Autor: Michal Svoboda
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.62
    (Počet známek: 3344)

    Komentáře k článku
    ja09.11.13:08sourdadnice
    joe24.01.17:38hmmm
    Michal Svoboda09.08.22:24Malá oprava
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena