Eleg nagy faba vagtam a fejszem, ugyanis gondoltam egyet es irni fogok egy raszterizert, ami a CPU-t hasznalja, nem a GPU-t android alatt. Ugye flutter alol nem igazan letezik opengl-ES jelenleg, igy texturazni haromszogeket nem tudunk.
Nah most igazabol mar keszen van a raszterizerem (apro glitch-ek meg elofordulnak, de van mar obj 3d viewerem, es fbx3d viewerem flutter ala), kesobb majd errol is irni fogok (talan meg meg is osztom a kodot egy library formajaban). De haladjunk lepesrol lepesre:
Mik a tervek (cikkek):
#1: obj file parse-olasa (itt leginkabb csak leirom en hogyan parse-oltam, es mik vannak egy obj fileban) ez a mostani cikk lesz az
#2: fbx file parseolasa (miket tartalmaz egy ilyen file kb)
#3: haromszogek kirajzolasa CustomPainterrel, kitoltes
#4: texturazas, raszterizalas
Na de essunk neki az obj file-nak. Amugy baromi egyszeru egy ilyen filet parse-olni, de gondoltam legyen magyarul is egy ilyen kis leiras.
Nezzunk egy kocka obj file-t, miket tartalmaz
# cube.obj
mtllib cube.mtl
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
usemtl cube
f 1/1/1 2/2/1 3/3/1
f 3/3/1 2/2/1 4/4/1
f 3/1/2 4/2/2 5/3/2
f 5/3/2 4/2/2 6/4/2
f 5/4/3 6/3/3 7/2/3
f 7/2/3 6/3/3 8/1/3
f 7/1/4 8/2/4 1/3/4
f 1/3/4 8/2/4 2/4/4
f 2/1/5 8/2/5 4/3/5
f 4/3/5 8/2/5 6/4/5
f 7/1/6 1/2/6 5/3/6
f 5/3/6 1/2/6 3/4/6
Mint lathato minden sor valamilyen karakter/ek-el kezdodik. Az obj file amugy statikus 3d file-okhoz jo, kesobb majd megnezzuk az animalt 3d file-okat is.
Termeszetesen meg sok eleme lehet egy obj filenak, mi csak egy alap parsert irtunk. A tobbi elemet (mint pl vp, line, o, g, s, stb attekintheted a linken) Jelen posztban nem terunk mi a material file reszletezesere sem.
Bovebb info a Wavefront obj file-rol
#: megjegyzes, ezt nem kell figyelembe vennunk a parse-nal. Amugy egy konnyen megirhato parserrol van szo, mivel text alapu a file. Sorrol sorra vegigmegyunk, es ha XXX-el kezdodik egy sor, akkor parse-oljuk az egyes tipusokat.
mtllib cube.mtl: egy 3d filehoz lehetnek materialok, anyagi jellemzok, pl szinezes, ez johet egy kulso filebol, az mtl file-bol. Egy eredmenyesebb parser-nal ezt is tudjuk parse-olni, most erre nem terunk ki nagyon mi van benne.
usemtl-el tudjuk hasznalni majd.
v: nyilvan egy Vert3D/Vertex3D/Point3D/Vec3/Vector3 a terben egy 3d pont, aminek van x,y,z erteke. (x,y,z, [w]) elemeket tartalmazhat)
vt: vertex texture, a vertexhez tartozo texturak ertekei ami ugye Vec2-ben van, van u es v erteke, 0 es 1 koze esik.
vn: normalok, minden vertexhez tartozik egy normal is
es akkor jon az f betu
f: a face roviditese, amely allhat 3*3 ertekbol, vagy 3*2 vagy 3*1 ertekbol, attol fuggoen, hogy a file-unk tartalmaz e vt-ket, normalokat. Tehat pl 5/1/2 vagy 5//1 vagy 5
egy resz f 5/3/6 azt jelenti, hogy az 5-os indexu vertex-rol van szo, a 3-as indexu textura koord-rol, es a 6-os indexu normalrol.
a face indexeket kulon faceIndices listaba tehetjuk, erre amugy azert van szukseg, mert kesobb a megjelenitesnel meg az indexek alapjan sorrendbe kell rakni a Vertexeket, TextureCoords-okat es persze a Normalokat, kulonben osszevisszasag jelenik meg a kepernyon. A face index mindig 1-el kezdodik, ezert ki kell vonni belole 1-et, hogy a tenyleges indexet megkapjuk.
Ez eddig eleg konnyu volt gondolnank, de a face index lehet minusz elojelu is. Ilyenkor mindig az aktualis vertex/normal/vt listank vegetol szamoljuk az indexet.
Azaz -1 index a faceben vertexnel azt jelenti, hogy a listank legvegerol kell venni az elemet. -1 jelenti az utolso elemet, -2 a masodikat lentrol, stb.
Amugy celszeru az obj parser-t ugy megirni, hogy REGEX-el toroljuk belole a bizonytalan karaktereket/vicces charokat es a duplazott white space-eket.
Ennyi volna, baromi egyszeru kis obj file tipus leiras.