Android Programjaim

Android, Flutter/Dart, Kotlin, Java, Unity, HarmonyOS

Raszterizer irasa flutterben #1 - obj file feldolgozas

2020. január 22. 08:19 - lacas8282

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.

 

 

 

komment
Címkék: obj rasterizer
süti beállítások módosítása