Hirdetés

Alkalmazásfejlesztés badára: 3D modell importálása OpenGL ES-be

Bevezető

Aki egy kicsit komolyabban foglalkozik számítógépes grafikával, bizonyára találkozott már 3D-s modellező szoftverekkel, mint például a 3D Studio Max, Maya, Blender. Segítségükkel egyszerűen lehet komplex modelleket építeni, textúrázni, effektezni, minden, ami szem-szájnak ingere. Bár ezen progik célja teljesen más, mint ami az OpenGL-ben való pötyögésnek (előbbi inkább művészeti, utóbbi informatikus irányzatot képvisel), biztosan sokan örülnének neki, ha az így elkészített modelleket fel tudnák használni az OpenGL-es fejlesztéseik során.

A megoldás

A netet böngészve a megoldás után találtam egy Perl scriptet, ami pont ezt végzi el. Magát a scriptet Heiko Behrens készítette el, akinek a neve iPhone-fejlesztőknek ismerősen hangozhat: egy nagyon komoly blogot üzemeltet (http://www.heikobehrens.net), ami alma-közeli formáknak sok ínyencséggel szolgálhat. Az algoritmus menete a következő: elkészítjük a modellünket, kiexportáljuk .obj formátumba, megetetjük a scripttel és kész is.

Tehát először el kell készíteni a modellünket. A bejegyzéshez két modellt fogok használni, egyik egy teherautót, a másik egy aszteroidát reprezentál. Előbbi kicsit bonyolultabb felépítésű és textúra nélküli, így maga a modell is jól látszik, a második egy egyszerű objektum, ehhez azonban textúrát is rendeltem. Ezek láthatók az alábbi képen.

Ez után jöhet az exportálás .obj formátumba. Ez a formátum egy modellező szoftverek közötti interfészként fogható fel, a legtöbb ilyen program implementálja, többek között a max, a Maya és a Blender is. A Wavefront feljesztette ki, kizárólag a jelenetünkben szereplű geometria tárolására szolgál, tehát a textúrákat magunknak kell létrehozni. A .obj file tartalmazza a vertexek definícióját (v-vel kezdődő sorok), a normalvektorokat (n-nel kezdődő sorok), a textúra-koordinátákat (vt-vel kezdődő sorok). Kiexportálja a material definíciókat is egy .mtl fileba, azonban sok esetben a modellező programban felhasznált materialok nem kompatibilisek az OpenGL ES 1.x-szel (például a raytrace-elt reflective/refractive mat-ok), így érdemes az anyagokat a már ismertetett módon magunknak definiálni. Amire érdemes odafigyelni, hogy a script csak egy textúrát tud kezelni, így amennyiben többet használunk egy modellen, szedjük szét az objektumunkat ennek megfelelően. Ahol textúrázunk, a kirajzolás előtt olvassuk be a textúrát, majd az ismert módon rendeljük hozzá az objektumhoz.

Jöhet a script futtatása. Ehhez telepíteni kell a Perlt (Windows alatt, a Linux alapból tartalmazza), majd parancssorból futtatni azt (obj2opengl.pl wavefront_obj_neve.obj). Az eredmény egy *.h header lesz, ezt a projektünkhez adva (és includeolva) már rajzolhatunk is. Az egyetlen hátulütő a generált file mérete: nekem az autó egy 14 megás .obj-ből 90 megás .h lett (~80k vertex és 162.5k face), az aszteroida pedig egy 1.3 megás bemenetből 9 megás lett (~8k vertex és 16k face). Ezen lehetne javítani, ha nem háromszög-alapon történne a kirajzolás, hanem triangle strip-ként, így kevesebb vertexet tartalmazna a file.

A fenti képeken látszanak az általam készített modellek: az elsőn az autó modellje, a másodikon pedig az aszteroida. Még egyszer köszönet a szkriptért Heiko Behrnens-nek, letölthető a erről a címről.

holdmester

Előzmények