# Geometriai transzformációk

## Kapcsolódó előadás anyag

- Web: http://www.inf.u-szeged.hu/oktatas/jegyzetek/KubaAttila/szgrafika/transzformaciok.html

- A 3D objektumokat saját koordináta-rendszerükben modellezzük, végleges helyükre a világ koordináta-rendszerben a geometriai transzformációk alkalmazásával kerülnek.
- Az OpenGL nyilvántart egy aktuális geometriai transzformációt (ez a ModelView), amit mindig automatikusan végrehajt a `glVertex()`-ben megadott csúcspontra.

- A `ModelView` inicializálása (pl. a `ChangeSize()` függvényben):

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

- Aktuális trafó verembe mentése/visszatöltése: `glPushMatrix(); glPopMatrix();`

- Példa az aktuális trafó módosítására (feltesszük, hogy a `ModelView` az egységmátrix kezdetben):

  Művelet | Függvény | Hatása | ModelView
  Aktuális mátrix a verembe | `glPushMatrix();` | `ModelView`-t "megjegyezzük". | `I`
  Eltolás (T) | `glTranslatef(tx, ty, tz);` | `ModelView = ModelView * T` | `I * T`
  Elforgatás adott irány körül (R) | `glRotatef(angle, x0, y0, z0);` | `ModelView = ModelView * R` | `I * T * R`
  Skálázás (S) | `glScalef(sx, sy, sz);` | `ModelView = ModelView * S` | `I * T * R * S`
  Csúcspont megadás | `glVertex3f(x, y, z);` | `I * T * R * S * Transp[x, y, z, 1]` | `I * T * R * S`
  Aktuális mátrix a veremből | `glPopMatrix();` | A legutóbbi `ModelView`-t visszaállítjuk. | `I`

- Amint látható, az utolsó függvényhívás hatása érvényesül először!

## Nate Robins tutorial

- | Windows: `transformation.exe` `glut32.dll` Linux: `/pub/szgrafika/szamitogepes_grafika/Tutors.linux/transformation` Bal egérgomb: paramétermódosítás. Jobb egérgomb: opciók (mindkét panelen!).

## Példaprogramok

- Geometriai transzformációk téglatestekkel, egyszerűtől az összetettebbig

- Megoldások: kocka_trafo.c kocka_trafo2.c

- Tank modellezése

## Feladat

- Helikopter modellezés. 4 téglatestből: fülke, farok, két rotor. A rotorok forogjanak folyamatosan.

Last modified: Tue Sep 29 10:36:57 Central Europe Daylight Time 2015