Néztem videót az Unity editoráról, és már régebben is gondolkoztam rajta, de így gyakorlati hasznát is láttam annak a dolognak, hogy mindenféle 3d-s objektumot lehet bármilyen, szintén 3d-s objektumhoz kapcsolni. Ezt csináltam most meg.
Van egy ősosztály, a Node3D, ami rendelkezik Position, Scale, Rotate 3d-s vektorokkal, és egy World mátrixszal. Emellett Update, UpdateChildren és UpdateAsChild metódusokkal. A memberek egyértelműek, a metódusok:
Node3D::Update(): itt döntöm el, hogy az adott Node-t transzformálni kell-e... 3 lehetőségünk van:
- van egy kötelező transzformálás, ha mondjuk éppen hozzá lett adva egy másik node-hoz, vagy elvéve, ilyesmi esetek (HaveToTransform)
- egy lehetséges eset az, hogy eltárolom az előző frameben lévő pozíciót, forgatást és skálázást, ezeket összehasonlítom, és ha valamelyik nem egyezik meg, akkor transzformálva lett az adott node
- a harmadik lehetőség az, hogy ha az előző kettő nem igaz, akkor megnézzük, hogy van-e szülője. Ha van, és az volt transzformálva, akkor az adott node is van, egyéb más esetben pedig nincs.
Ez azért jó, mert nem kell így mindent mindig újraszámolni. Ami azért lássuk be... kíméli a cpu-t :)
Miután eldöntöttük, hogy transzformálni kell-e, minden osztálynak jön a saját Update metódusa, ahol kiszámolja a world mátrixát (meg amit akar).
Először meghívom az összes Node Update-jét, így meglesznek a world mátrixok. Ezután azoknak a Node-oknak, amiknek nincs szülője, meghívom az UpdateChildren() metódusát, ami frissíti a gyerekeket (ami igazából meghívja az UpdateAsChild() metódust), ahol minden egyes gyerek a saját maga által definiált metódusban frissíti önmagát. Hülyén hangzik, de pl. Entity esetén ez: world = world * parent->world
Nagyjából erről lenne szó. Régen az volt, hogy csak Entity-ket tudtam egymáshoz kapcsolni, de most már, ami Node3D-ből öröklődik, és le vannak implementálva a megfelelő metódusai, azt lehet egymáshoz kapcsolni. Így pl. egy animált modellt egy animált modellhez, az animált modell egy csontjához pedig egy sima modellt. De akár részecskerendszert, fényt, bármit lehetne, csak az még nincs kész :)
Itt is egy kép az előbbiekről, a középsőhöz van hozzácsatolva a másik, mind a kettő forog, mozog, és a középső egyik csontjához hozzá van csatolva egy Entity (ami most éppen ugyan olyan "karakter"). A modell elég vicces, de programmer art-ként, place holdernek szerintem tökéletes :D


Ajánlott bejegyzések:
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.