Laden und Speichern von Meshes. von ???
Hi.

Ich habe hier (durch verbesserung von Freax (danke nochmals an ihm)) eine Routine, dass Meshes Laden und Speichern kann.

Für einige ist das nichts besonderes, aber für andere schon, die schon immer solche Routinen suchten:

Hier die Funktion um einen Mesh zu Speichern:
[code:1:b9bb7bea4b]Function Save_Mesh(Mesh,File$)
Local Stream,S,Surface,V,T
Stream = WriteFile(File$)
WriteLine Stream,CountSurfaces(Mesh)
For S = 1 To CountSurfaces(Mesh)
Surface = GetSurface(Mesh,S)
WriteLine Stream,CountVertices(Surface)
For V = 0 To CountVertices(Surface) - 1
WriteLine Stream,VertexX#(Surface,V)
WriteLine Stream,VertexY#(Surface,V)
WriteLine Stream,VertexZ#(Surface,V)
WriteLine Stream,VertexU#(Surface,V)
WriteLine Stream,VertexV#(Surface,V)
WriteLine Stream,VertexNX#(Surface,V)
WriteLine Stream,VertexNY#(Surface,V)
WriteLine Stream,VertexNZ#(Surface,V)
Next
WriteLine Stream,CountTriangles(Surface)
For T = 0 To CountTriangles(Surface) - 1
WriteLine Stream,TriangleVertex(Surface,T,0)
WriteLine Stream,TriangleVertex(Surface,T,1)
WriteLine Stream,TriangleVertex(Surface,T,2)
Next
Next
CloseFile Stream
End Function[/code:1:b9bb7bea4b]

Und hier eine Funktion um das Mesh zu Laden:
[code:1:b9bb7bea4b]Function Load_Mesh(File$)
Local Stream,Mesh,SCount,VCount,TCount,S,VNX#,VNY#,VNZ#
Local Surface,V1,T,X#,Y#,Z#,U#,V#,VT0,VT1,VT2
Stream = ReadFile(File$)
Mesh = CreateMesh()
SCount = ReadLine$(Stream)
For S = 1 To SCount
Surface = CreateSurface(Mesh)
VCount = ReadLine$(Stream)
For V1 = 0 To VCount - 1
X# = ReadLine(Stream)
Y# = ReadLine(Stream)
Z# = ReadLine(Stream)
U# = ReadLine(Stream)
V# = ReadLine(Stream)
VNX# = ReadLine(Stream)
VNY# = ReadLine(Stream)
VNZ# = ReadLine(Stream)
AddVertex Surface,X#,Y#,Z#,U#,V#
VertexNormal Surface,V1,VNX#,VNY#,VNZ#
Next
TCount = ReadLine$(Stream)
For T = 0 To TCount - 1
VT0 = ReadLine(Stream)
VT1 = ReadLine(Stream)
VT2 = ReadLine(Stream)
AddTriangle Surface,VT0,VT1,VT2
Next
Next
CloseFile Stream
Return Mesh
End Function[/code:1:b9bb7bea4b]

MfG ShadowTurtle
===
von ???
Ähhhh....(zu-dummer-Frage-aushol)...das finde ich interessant, aber in was für einem (Datei)format muss das Mesh denn vorliegen? Sieht ja aus, als ob die Routine irgendwas an Klartext, also ASCII, an Format erwartet.

Grüße,
Thomas
===
von ???
Hi!
Das ist ein eigenes Dateiformat von ST.
Es ist ein ASCII-Format stimmt, aber drotzdem schwer
von außen ersichtlich zum editieren. Normalerweiße
ignorieren z.B. die meisten ASCII-Formate kommentare,
wo man z.B. rein schreiben könnte, wo die Position eines
Verex steht etc.
mfg olli
===
von ???
@4pac:
Wenn Du z.B. ein Model (z.B. ein Stuhl) hast, und Du willts wenig Festplatten-Speicher verbrauchen (mir ist bisher nur dieser Grund eingefallen :oops: ), dann kannts Du dieses Format benutzen: Es ist Direkt, Kurz und sogar leicht zu verstehen.

@EDIT: Vieleicht werde ich später sogar noch Animationen einbauen; Es ist dann z.B. auch möglich eine Player Figur mit Animationen zu laden usw.

MfG ShadowTurtle
===
von ???
Wieso speicherst du alles mit Writeline? Ich glaube nicht das jemand das in nem Text Editor editieren will/kann... Writeint oder writeshort wäre da doch besser geeignet oder?
===
von ???
@DC: So kann aber ein Außenstehender einen Im/Exporter für das Format schreiben ohne sich durch Specs wühlen zu müssen
===
von ???
Hi!
Da muss ich DC Recht geben!
Man sollte zumindest bei solchen Formaten kommentare
erlauben, und somit eine Zeile auswerten, wenn sie z.B.
kein Semikolion davor stehen hat.
Und dann kann man das auch noch mit den anderen Befehlen machen:
[code:1:2c8602d93d]
Function Save_Mesh(Mesh,File$)
Local Stream,S,Surface,V,T
Stream = WriteFile(File$)
WriteShort Stream,CountSurfaces(Mesh)
For S = 1 To CountSurfaces(Mesh)
Surface = GetSurface(Mesh,S)
WriteInt Stream,CountVertices(Surface)
For V = 0 To CountVertices(Surface) - 1
WriteFloat Stream,VertexX#(Surface,V)
WriteFloat Stream,VertexY#(Surface,V)
WriteFloat Stream,VertexZ#(Surface,V)
WriteFloat Stream,VertexU#(Surface,V)
WriteFloat Stream,VertexV#(Surface,V)
WriteFloat Stream,VertexNX#(Surface,V)
WriteFloat Stream,VertexNY#(Surface,V)
WriteFloat Stream,VertexNZ#(Surface,V)
Next
WriteInt Stream,CountTriangles(Surface)
For T = 0 To CountTriangles(Surface) - 1
WriteInt Stream,TriangleVertex(Surface,T,0)
WriteInt Stream,TriangleVertex(Surface,T,1)
WriteInt Stream,TriangleVertex(Surface,T,2)
Next
Next
CloseFile Stream
End Function
[/code:1:2c8602d93d]
und
[code:1:2c8602d93d]
Function Load_Mesh(File$)
Local Stream,Mesh,SCount,VCount,TCount,S,VNX#,VNY#,VNZ#
Local Surface,V1,T,X#,Y#,Z#,U#,V#,VT0,VT1,VT2
Stream = ReadFile(File$)
Mesh = CreateMesh()
SCount = ReadShort(Stream)
For S = 1 To SCount
Surface = CreateSurface(Mesh)
VCount = ReadInt(Stream)
For V1 = 0 To VCount - 1
X# = ReadFloat#(Stream)
Y# = ReadFloat#(Stream)
Z# = ReadFloat#(Stream)
U# = ReadFloat#(Stream)
V# = ReadFloat#(Stream)
VNX# = ReadFloat#(Stream)
VNY# = ReadFloat#(Stream)
VNZ# = ReadFloat#(Stream)
AddVertex Surface,X#,Y#,Z#,U#,V#
VertexNormal Surface,V1,VNX#,VNY#,VNZ#
Next
TCount = ReadInt(Stream)
For T = 0 To TCount - 1
VT0 = ReadInt(Stream)
VT1 = ReadInt(Stream)
VT2 = ReadInt(Stream)
AddTriangle Surface,VT0,VT1,VT2
Next
Next
CloseFile Stream
Return Mesh
End Function
[/code:1:2c8602d93d]

[quote:2c8602d93d]
EDIT: Vieleicht werde ich später sogar noch Animationen einbauen; Es ist dann z.B. auch möglich eine Player Figur mit Animationen zu laden usw.
[/quote:2c8602d93d]
Da sehe ich eher schwarz dafür. Wie willst Du z.B. alle Bones
aus dem Mesh entnehmen? Es gibt leider noch kein Befehl
der eine Liste für FindChild ausspuckt, und anders müsste man
alle Formate lesen können, und aber auch noch wissen, welches
Dateiformat hier für dieses geladene Mesh vorliegt.
Laden eines solchen animierten Meshes geht sicher, ist nur etwas
aufwendig zu programmieren.
[quote:2c8602d93d]
wenig Festplatten-Speicher
[/quote:2c8602d93d]
das ist bei vielen fällen falsch. Hast Du z.B. eine Floatzahl
mit 1.004164 , so wird dieser Wert in der Datei mit WriteLine
10 Byte annehmen, mit WriteFloat nur 4.
Das ganze musst Du jetzt für Normals Position und UVW Koordinaten
aufrechnen, und für jeden Vertex abspeichern. Da ist das Format alles
andere als Sparsam, da fast eh immer eine große Anzahl an
nachkomma Zahlen kommt, bei z.B. UV.

mfg olli
===
von ???
Ist interessant das ganze.

Mich würde sowieso interessieren, wie die ganzen Formate aufgebaut sind.
Nicht nur 3D sondern auch andere wie zum beispiel die vom bmp bildern.

Gibts da ne Seite oder mehrere wo das steht???
===
von ???
Hi!
Ja www.wotsit.org
und für bmp hat morszeck ein loader schon gemacht:
http://blitzbasic.ch/text.php?id=6&s=read
hey der hat ja sogar ein neuses layout für die seite :shock:
sieht jedenfalls besser aus.
wenn Du Dich mal testen willst, versuche ein TGA
Bild zu laden. Der Dateiaufbau ist übelst leicht.
mfg olli
===
von ???
@Bruzard: Eh .. naja ... es ist doch das Wichtigste möglichst viele Daten mit möglichst geringem Speicherverbrauch zu speichern (?). Dazu kommt das man ja trotzdem nicht weiss, in welcher Form das Zeugs gespeichert ist. OK - man weis das alles mit Writeline gespeichert wurde, aber nicht in welcher Reihenfolge. Also muss man sich trotzdem durch "Specs wühlen" .. oder hab ich da was falsch verstanden?
===
von ???
Hi.
Das mit den Animationen könnte Funktionieren. Sowohl Laden als auch Speichern.

BlitzBasic hat z.B. die möglichkeit MD2 Models zu Animieren, richtig? Und dabei werden ja nur die vertexe bewegt. Richtig? (im endeffekt, meine ich)

Jetzt müsste man nur noch eine Schleife (beim Abspeichern) machen, dass alle Frames eines Models durchgeht und jedes mal die Vertex Position Speichern.

Also so ungefähr:
[code:1:859c49eb8d]- Speichere das ganze Model (hab ich ja schon)
- Schreibe in Datei, wieviel Frames das Model hat.
- Fange Schleife an, die jeden Frame des Models durchgeht.
-- Führe UpdateWorld aus, damit die Vertexe auch dementsprechend Animiert werden. (Bei Bones werden die vertexe ja auch bewegt... im Endeffekt ;) )
-- Lese jeden Vertex ein, dessen Position sich geändert hat, und Speichere den einen Frame ab.
-- Schreibe als Float z.B. -10.12345 damit der Loader nachher weiß, dass das Laden des Frames Beendet ist.
- Die Schleife ist nun beendet.[/code:1:859c49eb8d]

Und so würde die Lade Routine aussehen:
[code:1:859c49eb8d]- Lade das ganze Model (hab ich auch schon)
- Lese die anzahl der Frames im Model aus.
- Gehe mit einer Schleife die ganzen Frames durch.
-- Erstelle mit SetAnimKey (oder wie dat hieß) einen Frame für das Model.
-- Lade die Positionen der Vertexe so lange aus bis z.B. -10.12345 kommt.
-- Richte nun alle Vertexe aus. (oder mache das beim zuletzt genannten Schritt sofort)
- Führe die schleife so lange aus, bis alle Frames geladen sind.[/code:1:859c49eb8d]

Der einzigste nachteil (für manch auch ein Vorteil) daran ist, dass die Bones verschwunden gehen.

MfG ShadowTurtle



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: