obj importer + simpler material support [Blender]

    • Skript

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • obj importer + simpler material support [Blender]

      .obj import + material support

      optimiert für Blender



      Ich habe vor einiger Zeit einen eigenen 3D obj importer geschrieben, da die wenigen "vorhandenen" 3D importer die für den GM bis dato geschrieben wurden immerwieder zu problemen führten.
      Man wusste nicht wirklich welche limitationen die skripte hatten und musste mit den export einstellungen rumspielen um das obj modell korrekt zu exportieren, und dann gab es auch noch eigenartige Fehler, bei denen die y-achse eines 3D modells gespiegelt wurde.

      Das Script welches nach einigen researchen und einigen programmierstunden rauskam, hat auch noch Materialsupport gehabt. Der Script kann zwar nur Farben auslesen (Diffuse color), jedoch kann dieser (in kombination mit shadern) erweitert werden.

      Bevor ihr das Skript verwendet, solltet ihr euch evtl anschauen wie man das modell korrekt aus blender exportiert:

      Model export:
      Spoiler anzeigen

      Der erste schritt wäre das Modell in Blender (wahlweise mit materials)
      zu modellieren und es dann über die File>Export funktion als modell zu exportieren


      Dort müssen nun bestimmte einstellungen vorgenommen werden:


      Fettgedruckte einstellungen sind pflicht, unterstrichene nur optional
      [ ] Selection only > nur wenn es mehrere objekte in der Scene gibt und ihr nur das selektierte exportieren wollt
      [ ] Animation > leer lassen
      [ ] Apply Modifiers > Falls ihr Modifiers nutzt, könnt ihr diese verwenden
      [ ] Include Edges > nicht nötig
      [ ] Smooth groups > nicht nötig
      [ ] include normals > Falls ihr lichter verwenden wollt, könnt ihr ide normals mitexportieren.
      [ ] Include UVs > Wenn ihr das Modell uv-unwrapt habt, so könnt ihr diese option einschalten
      [ ] Write Materials > falls man die Materials mitexportieren möchte (Materials werden in ein eigenes File exportiert!)
      [ ] Triangulate faces > WICHTIG! Ohne dieser einstellung funktioniert das Skript nicht!
      [ ] Write nurbs > ignorieren
      [ ] Polygroups > ignorieren
      [ ] Objects as Obj Objects > ignorieren
      [ ] Objects as OBJ Groups > ignorieren
      [ ] Material Groups > ignorieren
      [ ] Keep Vertex Order > ignorieren


      Bei Game Maker und den obj-importern hatte man des öfteren das Problem, dass man nicht wusste wie das obj modell exportiert wird.
      Es könnte sein dass die Achsen des Modells komplett durcheinander kommen. So konnte es damals schonmal passieren das das Modell im GM plätzlich um 90 grad rotiert in der Seitenlage importiert wird.

      Daher müssen wir beim Export die achsen richtig definieren:
      Forward: Y-Forward
      Up: Z Up


      Auf die Art und weise wird das OBJ modell so exportiert, dass die
      XYZ Achsen in Blender denen in Game Maker entsprechen. > Das modell wird so wie es exportiert wurde, auch im GM importiert.

      Nun, aus irgendeinem Grund (hat irgendetwas mit den forward und up-vektoren zu tun)
      ist das ganze modell auf der y-achse gespiegelt:

      Darum braucht ihr euch aber nicht zu kümmern.
      Das Skript spiegelt beim Import die y-Achse automatisch.

      Dass heisst: Orientiert euch beim Modellieren in Blender nach der X und Z-achse.
      Die y-Achse ist gespiegelt, jedoch gleicht das der import skript automatisch wieder aus.




      Verwendung des Skripts:
      Spoiler anzeigen

      Wenn ihr ein neues 3D Modell laden wollt, so müsst ihr einfach nur volgenden Befehl ausführen:

      GML-Quellcode

      1. model = scr_load_model_obj("./ufo.obj");


      Habt ihr die Material Files mitexportiert und wollt diese laden, so müsst ihr das mtl file im Skript
      zusätzlich zum obj file angeben:

      GML-Quellcode

      1. model = scr_load_model_obj("./ufo.obj","./ufo.mtl");


      Wie ihr sehen könnt ist der 2te Parameter nur optional. Ihr könnt angben ob ihr Materials laden wollt oder nicht.

      Zeichnen könnt ihr das Modell wie gewohn mit

      GML-Quellcode

      1. d3d_model_draw(model,0,0,0,-1);





      Infos/Lizenz:
      Das Skript ist zu 100% open-source.
      Ihr dürft den Skript ohne jegliche Einschränkungen:
      - verwenden
      - editieren/erweitern
      - weiterverteilen

      Credits sind überhaupt nicht notwendig.

      Funktioniert sowohl mit GM: Studio als auch mit GM 8.1.

      Download befindet sich im Dateianhang mit dem entsprechenden example + einem Blender file zum testen des exports.
      Dateien
      • obj importer.zip

        (1,01 MB, 2.672 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von LEWA ()

    • Ein großes Dankeschön schon mal im Voraus, LEWA!
      Wenn ich mich mal mit 3D befasse (was ich irgendwann werde) dann kann mir das sicher nützlich werden.

      Ist nicht selbstverständlich, dass du etwas (open-source) mit der Community teilst, womit du sehr viel Arbeit verbracht hast.
    • RLP schrieb:

      Ist nicht selbstverständlich, dass du etwas (open-source) mit der Community teilst, womit du sehr viel Arbeit verbracht hast.

      Ich bin jemand der über die Jahre hinweg über verschiedene "Bedingungen" die einige GM-User aufstellen ein wenig sauer geworden. XD
      Eines der Beispiele was mir besonders im Kopf geblieben ist, ist ein anderer obj-loader den ich vor ca 2-3 Jahren verwendet habe. (Mosaic light? k.a.)
      Der Creator hat dort in den Script etwas in der Art Hingeschrieben:
      "Credits: vorname Nachname, All rights reserved"
      Und dann eine weitere Zeile die in etwa lautete: "Don't edit this script!"

      Und ich habe das irgendwie böse aufgefasst. XD Nicht nur das dieses Skript fehleranfällig war (obj files können verschiedene informationen speichern und einige von ihnen schrotteten das Skript > Es wure nicht spezifiziert, was das Skript eigentlich unterstützt und was nicht)
      ,ich dachte zusäzlich auch noch dass ich nicht befugt bin diesen Skript zu editieren/an meine wünsche anzupassen. (Damals hatte ich von dem Zeug zwar keine Ahnung, aber das war für mich nebensächlich. Es ging ums Prinzip XD)
      Klar, niemand konnte letztendlich nachprüfen ob der Skript verändert worden wäre, aber wie gesagt. > Es geht um das Prinzip an sich.

      Seither bin ich jemand der sehr stark auf Open-source (in jeglichen Bereichen der programmierung) setzt. Wieso sollte man jemandem eine Funktion anbieten wenn man dem User nicht erlaubt den Skript anzupassen? (Bei sachen wie eine riesige Engine wie UDK oder Cryengine versteht man ja noch irgendwelche Lizenzahlungen... man muss ja von irgendetwas leben. XD Aber bei einfachen Sachen wie einen obj-importer den man sich mit ein wenig researching auch selber bauen kann...)
      > Jedes Projekt ist anders aufgebaut und dementsprechend könnte man andere Anforderungen an den Skript haben.
      Ich möchte niemanden limitieren sondern 100%ige freiheit in Bezug auf verwendung, editierbarkeit und weiterverteilung bieten. Alles andere wäre (insbesondere bei solch "relativ" einfachen Sachen)
      eine Einschränkung die aus logischer Sicht völliger Blödsinn ist. Letztendlich profitieren alle von Open-source.

      Ich werde in nächster Zeit auch noch den 3D Animationsshader + das ganze "Framework" zum importieren von Animationen (per .obj Files und mit Material support)
      als Open-source hochladen. Das .gmx File steht schon und funktioniert einwandfrei (dokumentation sollte auch fertig sein)

      Dass einzige was noch fehlt ist ein simples 3D modell was simple-bone animationen beinhaltet mit denen sich andere User rumspielen können und ein kleines tutorial
      über die Verwendung der Skripte.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

    • Erst mal ein Lob und ein Dankeschön für deine Arbeit. Da ich grad dabei bin, mich in Blender einzuarbeten kann dieses Script auch gut gebrauchen. Ich hab nur eine Frage. Du schriebst:
      Der Script kann zwar nur Farben auslesen (Diffuse color), jedoch kann dieser (in kombination mit shadern) erweitert werden.

      WIe genau kann ich mir das vorstellen. Leider verstehe ich von Shadern noch nichts aber mich würde interessieren was man mit den obj-dateien mit shadern machen kann, wie du das meinst.
    • Der Script verwendet (um die verwendung so einfahc wie nur möglich zu gestalten) die d3d modelle des GMs. Aus technischer sicht sind diese einfache Vertexbuffer die ein festgelegtes Format besitzen. (xyz rgba uv normalXYZ)
      Der Script liest einfach die Dateien im mtl File (falls vorhanden) und fügt die Farben in das RGBA attribut des jeweiligen Vertices hinein.

      Man kann den OBJ-script erweitern sodass im MTL file noch weitere sachen (wie reflektivitätsfaktor, transparenz, etc...) ausgelesen werden, jedoch muss dann das Vertexformat gegebenenfalls erweitern (falls die Daten auch zwischen den Polygonen unterschiedlich sein können) um die Daten dann in den Vertices speichern zu können (sprich: man muss die neuen funktionen zur vertexbuffer erstellung nutzen). Dann kann man für dieses neue Vertexformat einen Shader schreiben der die Daten verwertet und das grafische resultat erzeugt.

      Ist in bezug auf den Schwierichkeitsgrad jetzt nicht die Welt, aber man braucht zugegebenermaßen ein wenig Know-how in bezug auf vertex-buffer/vertex-formats und shaderprogrammierung um das umsetzen zu können.