Ich hatte die letzten Tage mal Zeit, mich etwas näher mit OGRE bzw. der PureBasic Implementierung von OGRE zu widmen und kam dabei unweigerlich zu dem Problem: Wie bringe ich meine Modelle in das .mesh Format? Da ich weder mit Blender noch mit DeleD besonders erfolgreich war (Blender wollte meine 3ds Dateien nicht importieren, bei DeleD habe ich die Exportfunktion für .mesh nicht gefunden) habe ich mich der nächstbesten kostenlosen Möglichkeit zugewendet: Konvertieren mit Hilfe von Wings3D. Dies soll ein kurzes Tutorial sein damit ihr einen Grossteil eurer Modelle einfach konvertieren könnt. Auf Probleme gehe ich nachher noch ein.
Voraussetzungen
Zunächst einmal braucht ihr ein 3D Modell (logisch, oder?) welches in einem der folgenden Formate vorliegt: ndo, 3ds, ai, fbx, obj. Falls ihr natürlich Wings3D generell als Modeller verwendet ist das wings Format optimal. Als Nächstes müsst ihr Python 2.2 (ich habe es nicht mit höheren Versionsnummern versucht) bei folgender Adresse herunterladen: http://www.python.org/2.2.3/. Installiert Python in einen Ordner eurer Wahl (optimalerweise nicht in irgendwelche verschachtelten Unterordner). Bei mir liegt Python beispielsweise im Verzeichniss "E:\python22\". Entweder merkt ihr euch das Verzeichniss, oder ohr macht Folgendes (WindowsXP, bei anderen Windows Versionen funktioniert das u.U. ähnlich): Desktop -> Rechtsklick auf Arbeitsplatz -> Eigenschaften -> Erweitert -> Umgebungsvariablen -> unter "Systemvariablen" den Eintrag "Path" auswählen -> Bearbeiten -> am Ende von "Wert der Variablen" folgenden Eintrag anhängen: ;[Pfad von Python]. Bei mir ist es z.B. ;E:\Python22\ dies bewirkt, dass ihr Python von jedem "Ort" aus starten könnt und nicht immer in der Eingabekonsole per Hand in den Pfad von Python wechseln müsst.
Dann brauchen wir noch 2 Downloads von der OGRE Seite http://www.ogre3d.org/index.php?option= ... tcat&cat=5, nämlich die CommandLineTools und den Wings3D Exporter. Achja, falls ihr Wings3D noch nicht habt: http://prdownloads.sourceforge.net/wing ... e?download. Vergesst nicht, die Downloads von der OGRE Seite in Verzeichnisse zu extrahieren, die möglichst keine Leerzeichen enthalten.
Hey ho, let's go!
So, zunächst müsst ihr euer Modell in Wings3D laden und als .wings Datei abspeichern. Sollte nicht zu schwer sein, solange euer Modell in einem der oben genannten Formate vorliegt.
Als Nächstes öffnet ihr die Konsole. Nun führt ihr das w2o.py Script aus, welches beim Wings3D Exporter dabei ist, und zwar so:
Code: Alles auswählen
C:\>
C:\>python [Pfad der w2o.py Datei] [Pfad eures Modells]
Bei mir wäre das z.B.
C:\python E:\w2o\w2o.py E:\modelle\spaceships\prototype7.wings
Jetzt müssen wir noch OGREXMLConverter aufrufen und das machen wir so:
Code: Alles auswählen
C:>
- Wechsel in das CommandLineTools Verzeichniss -
C:\OGRECommandLineTools\ogrexmlconverter [pfad der .mesh.xml Datei]
Bei mir sieht das so aus:
C:\>e:
E:\>cd w2o\ogretools
E:\w2o\ogretools>ogrexmlconverter prototype7.mesh.xml
Probleme
Ich hatte beim konvertieren 2 Probleme.
1. Ich arbeite mit Nendo 1.5 und aus irgendeinem Grund will Wings3D die .ndo Dateien nicht importieren. Dieses Problem konnte ich umgehen, indem ich meine Modelle einfach als .3ds exportiert habe.
2. Einige .wings Dateien wurden bei mir nicht in das .mesh.xml Format konvertiert. Eine entsprechende Fehlermeldung sieht z.B. so aus:
Code: Alles auswählen
reading object 'Spikey' (498 faces, 747 edges, 251 vertices)
Traceback (most recent call last):
File "w2o.py", line 66, in ?
conv(arg, dstname, writeImages, keepRotation, scaleFactor)
File "w2o.py", line 15, in conv
obj = io3d_wings.read_wings(infile, writeImages, keepRotation)
File "io3d_wings.py", line 313, in read_wings
scene = ob.parse()
File "io3d_wings.py", line 45, in parse
return self.parse_2()
File "io3d_wings.py", line 59, in parse_2
self.postprocess(scene)
File "io3d_wings.py", line 299, in postprocess
wobj.make_face_normals()
File "mesh.py", line 163, in make_face_normals
n = pgon.pgon_normal(map(lambda v: self.verts[v], face))
File "pgon.py", line 20, in pgon_normal
return normal.unit()
File "vector.py", line 99, in unit
if len < 1e-5: raise ValueError('zero vector')
ValueError: zero vector
