Szerintem mindenki, aki három dimenziós játék írására adja buksi fejét, szembesül azzal a ténnyel, hogy 20xx-et írunk, és alig van olyan model formátum, amire egyértelműen azt lehet mondani, hogy elég lesz egy kisebb játékhoz. Nálam nagyjából ezt jelenti:
- stabilan működik az exporter
- könnyen betölthető
- képes csont alapú animáció(ka)t tárolni
- normalmapping-hoz van benne tangens vektor
- esetleg vertex color exportra is képes
Küszködtem .x parserrel Blender alatt eleget, hol működött az exporter hol nem, néha csak felét tolta ki az adatoknak. Ráadásul per face adta az adatokat, az egészet fel kellett dolgozni és kiválogatni az egyedi vertexeket, számolni a tangenseket. Ehhez nyilván kell egy plusz tool, ami kényelmetlen fejlesztéskor, mivel minden export után még azt is le kell futtatni, és csak ezután derül ki, hogy az engine-ben is jól szuperál-e a model.
Egyszer ebből elegem lett, és megnéztem az Blender .x Python exporter szkriptjét, bonyolult-e sajátot írni. Kiderült, hogy nem annyira bonyi, ráadásul a Blenderben nem csak per face vannak meg a vertex adatok, így előállítható egy ismétlések nélküli, hatékonyan rajzolható mesh. Azt nem mondanám, hogy egyértelműen, mert a vektorokon kívül minden vertex adat (normal,vertex color, texcoord,tangens) face-enként van meg, de minden face csúcs vektora tartalmaz egy indexet is egy központi vektor listára. Ebből az indexből kiindulva meg lehet csinálni az áhított vertex listát, ami a lehető legkevesebb adatot tartalmazza. Utána már csak ki kell menteni az adatokat fajtánként.
Az animáció már húzósabb, elég bonyolultnak tűnt, az copypaste lett, és egyelőre csak 1 animációt tartalmaz, valamint minden frameben kell minden csontnak animációs mátrix. Ez még változhat, mert az animálás most jön a játékban. A csontok hierarchiáját is elég egyszerűen oldottam meg, nem kell kapcsos zárójel erdő, mint a .x-ben, elég 2 kis integer tömb, az első a mátrixok számolásának a sorrendjét adja meg, a másik pedig az mátrix ősét a fában. A formátum kiterjesztése ’m’ lett.
Ezeket tudja eddig:
- vektor
- normális
- color
- textúra koordináta
- textúra neve
- tangens
- index buffer – háromszög lista
- skin info:
- vertex súlyok
- vertex indexek a súlyoknak
- csontok nevei
- csontok alap transzformációi
- mátrixok számolási sorrendje/ős-indexek
- animációk (még csak 1)
- animáció neve
- framek száma és indexxe
- mátrixok minden csontnak minden frame-re
A formátum lehet text és bináris is.
Fő a kényelem alapon csináltam egy betöltő dll-t is, ami csak standard c hívásokat használ, így könnyen csatolható olyan környezetekhez, ami tud dll-eket kezelni. Valamint elkészült a model nézegető progi is (mviewer), amivel rákattintva a .m filra egyből meg is lehet nézni color/vertex color/texture/normalmapping módban is, valamint az animációkat is lejátssza, ha kell. Ha megállja a helyét, akkor az egészet nyilvánossá teszem.
Még annyit hozzáfűznék az egészhez, hogy elég sokat szenvedtem a Blender OGl és a D3D koordináta rendszer inkompatibilitásával. A model nézegetőben némelyik háromszögön jól jelent meg a normal map, némelyiken negálva volt. Akármerre állítgattam a tangenst, sosem volt jó mindenhol. Végül arra jutottam, a tangens jól áll, a normális is, csak a bitangensnek (amit én a shaderben számolok) kéne fordítva lennie. Így szimplán negálom ott, és kész. Van is egy videóm hasonló témában, kicsit vicces lett.