Voor een projectje op Android ben ik bezig met Blender modellen importeren en te tonen in OpenGL. Ik ben begonnen met een zelfgeschreven .obj parser, maar dit leverde bij alleen vertex en face data al laadtijden van enkele seconden op. Na wat zoeken kwam ik een blogpost van een iPhone ontwikkelaar tegen die zijn eigen binaire formaat gebruikt om de overhead minimaal te houden.
Omdat ik toch al met Blender werk leek dit een goede optie. Ik ken nog geen Python maar met de bovenstaande tutorial (en het vervolg) kan ik prima uit de voeten.
Het binaire formaat komt hier op neer:
Helaas gaat het ondanks het relatief straight forward scriptje toch fout bij het exporteren. Een klein model met beperkt aantal vertices gaat goed; een cube van 8 vertices en 12 triangles word perfect weergegeven. Probeer ik echter meer dan 10 vertices (dus 30 floats) weg te schrijven dan lopen de waarden ineens van 1E-35 tot 1E35, terwijl de vertices nooit verder dan -5 tot 5 komen. Ook mijn triangle indexen die na de floats als integer worden weggeschreven hebben waarden die simpelweg niet mogelijk zijn (onder nul) of vér boven het aantal vertices uitkomen.
Het probleem kwam als eerste na voren in mijn Android applicatie (OpenGL gaat onderuit vanwege de niet bestaande vertexen (en mogelijk de bereiken van de vertices?)), maar bij het nakijken in een hex editor kwam ik dezelfde waarden tegen als in de java debugger.
De relevante Python code voor het exporteren:
Ik lijk iets over het hoofd te zien, maar wat?
Omdat ik toch al met Blender werk leek dit een goede optie. Ik ken nog geen Python maar met de bovenstaande tutorial (en het vervolg) kan ik prima uit de voeten.
Het binaire formaat komt hier op neer:
code:
1
2
3
4
5
6
7
8
9
| #Header [4bytes] int vertexCount [4bytes] int faceCount #Vertices [vertexCount * 3 * 4 bytes] floats coordinaten in x1,y1,z1, x2,y2,z2 #Normals [vertexCount * 3 * 4 bytes] floats coordinaten in x1,y1,z1, x2,y2,z2 #Triangle vertex indices [faceCount * 3 * 2 bytes] shorts vertex indexen |
Helaas gaat het ondanks het relatief straight forward scriptje toch fout bij het exporteren. Een klein model met beperkt aantal vertices gaat goed; een cube van 8 vertices en 12 triangles word perfect weergegeven. Probeer ik echter meer dan 10 vertices (dus 30 floats) weg te schrijven dan lopen de waarden ineens van 1E-35 tot 1E35, terwijl de vertices nooit verder dan -5 tot 5 komen. Ook mijn triangle indexen die na de floats als integer worden weggeschreven hebben waarden die simpelweg niet mogelijk zijn (onder nul) of vér boven het aantal vertices uitkomen.
Het probleem kwam als eerste na voren in mijn Android applicatie (OpenGL gaat onderuit vanwege de niet bestaande vertexen (en mogelijk de bereiken van de vertices?)), maar bij het nakijken in een hex editor kwam ik dezelfde waarden tegen als in de java debugger.
De relevante Python code voor het exporteren:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| mesh = Blender.Object.Get().getData(); file = open(filename, "w") # First 4 bytes is the vertex count as a signed int file.write(struct.pack(">i", len(mesh.verts))) # Second 4 bytes is the triangle count file.write(struct.pack(">i", len(mesh.faces))) # Vertex coordinates are saved as 4 byte floating points (3 * vertex count * 4 bytes) for vertex in mesh.verts: file.write(struct.pack(">fff", *vertex.co)) # Normal coordinates are saved as 4 byte floating points (3 * vertex count * 4 bytes) for vertex in mesh.verts: file.write(struct.pack(">fff", *vertex.no)) # Save triangle vertex indices as signed shorts (3 * face count * 2 bytes) for face in mesh.faces: for vertex in face.v: file.write(struct.pack(">h", vertex.index)) |
Ik lijk iets over het hoofd te zien, maar wat?