3d Objekt File für den Game Maker

    • Tool

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

    • 3d Objekt File für den Game Maker

      Der Anlass dafür, dass ich ein eigenes Objektformat entwickelt habe, war die Unzuverlässigkeit aller vorherigen Methoden 3d Modelle in Blender zu laden, da sehr oft Fehler auftreten, lange Ladezeiten inklusieve sind und die Files sehr groß und per Hand änderbar sind. Ich möchte im folgenden ein Blender Export Addon und ein Game Maker Import Skript bereitstellen, welche sehr leicht zu verwenden sind. Ich habe das Format so gestaltet, sodass es leicht erweiterbar ist. Es lässt sich zudem schnell laden und ist auch sehr kompakt. Dies liegt vor allem daran, dass Alles Binär gespeichert und geladen wird. Momentan werden die drei wichtigsten Daten gespeichert: Koordinaten, Normalen und Texturkoordinaten. Mit der Zeit versuche Ich es zu erweitern, wenn gar mit eurer Unterstützung das große Ziel die Animationen. Das große Problem welches Ich hatte war das Export Addon für Blender. Nach vielen Stunden konnte Ich jedoch einiges an Erfahrung gewinnen und die Animationsdaten sollte nur noch Dokumentationsarbeit sein.

      Der Aufbau des Files:
      Das File welches ich als Game Maker Objekt also die Endung .gmo getauft habe, beinhaltet eine einfache Struktur:

      Name
      Größe in Bytes
      Art
      flag
      1
      uChar
      chunk_count_body
      4
      uInt
      chunk_count_index
      4
      uInt
      chunk_body[chunk_count_body]
      • vertex_xyz
      • normal_xyz
      15
      • 12
      • 3

      • 3x float
      • 3x sChar
      chunk_index[chunk_count_index]
      • index
      • texture_uv
      2+(2)2+(8)1
      • 2+(2)2
      • (8)1

      • uShort2 (uInt)2
      • 3x float

      Fußnoten:
      1. Flag 0x01 ist wahr
      2. chunk_count_body ist kleiner gleich als 0xffff
      Ich hoffe die Namen sind selbsterklärend. Die Daten in den runden Klammern haben Relevanz, wenn die Bedinngung der Fußnote erfüllt ist. Die eckigen Klammern bedeuten, dass es sich um ein Chunk handelt, welcher entsprechend oft vorkommt.

      Die Anwendung:
      Dies ist wahrscheinlich der wichtigere Teil für euch. Ich fange erstmal mit dem Blender Export an und fahre danach mit dem Game Maker Import fort.

      Als Erstes müssen wir das von mir bereitgestellte Addon installieren. Dazu öffnen wir Blender. Um im Allgemeinen Addons zu installieren drücken wir strg+alt+U oder gehen auf File -> User Preferences... und gehen auf den Reiter Addons. Hier befinden sich alle installierten Addons und können sie entsprechend Aktivieren oder Deaktivieren mit der Checkbox rechts. Nun klicken wir auf Install from File... und wählen die entpackte Datei io_export_gmo.py aus. In den Addons sollte nun folgendes Addon gelistet sein:
      Import-Export: Export: Game Maker Object (.gmo)
      Dieses aktivieren wir und klicken auf Save User Settings, damit dieses nach einem Neustart weiterhin aktiv bleibt. Man kann es schneller wiederfinden, wenn man nach Imort-Export filtert. Was hat sich nun verändert? Bevor wir dazu kommen, müssen wir leider noch das Objekt vorbereiten, damit es auch richtig Exportiert wird. Mein Ziel ist es, diesen Schritt überflüssig zu machen und es automatisch geschehen lasse. Das Problem ist, dass generell nur Objekte aus Dreiecken unterstützt werden. Blender kann aber die Objekte auch aus Vierecken, Fünfecken usw. bilden. Desshalb müssen wir diese in Dreiecke umwandeln. Wenn wir dies nicht machen, kann es zu undefiniertem Verhalten führen, da mein Addon davon ausgeht, dass das Objekt nur aus Dreiecken besteht. Es bringt zwar weder Blender noch das Spiel zum Absturz, aber das Objekt wird entweder nicht angezeigt oder man hat ein schönes Farbenspiel aus Dreiecken. Deswegen diesen Schritt momentan noch unbedingt ausführen:
      Wir gehen einfach auf Add Modifier und wählen Triangulate aus. Nun können wir noch Quad Method auf Beauty stellen, damit es ein wenig hübscher aussieht. Dann auf Apply und das wars.

      Nun kommen wir endlich zum Exportieren. Wir wählen das zu exportierende Objekt aus. Unter File -> Export sollte in der Liste "Game Maker Object (.gmo)" zu finden sein. Wir wählen dies aus und es öffnet sich ein Fenster. Die Auswahlmöglichkeiten sind noch ziemlich karg, macht das ganze aber etwas einfacher. Auf der linken Seite kann man die Option "Include UVs" anwählen. Dies bedeutet einfach, dass die UV Koordinaten mit exportiert werden, falls sie vorhanden sind. Wir wählen einen Dateinamen und einen Speicherort und bestätigen mit Export GMO. Das wars auch schon mit dem Export.

      Nun komme ich zum Game Maker Import. Für den Import benötigen wir folgenden Skript:

      GML-Quellcode

      1. ///load_model(filepath)
      2. var v_x, v_y, v_z, n_x, n_y, n_z, t_u, t_v, v_i;
      3. var b_temp = buffer_load(argument0);
      4. buffer_seek(b_temp, buffer_seek_start, 0);
      5. var head_size = 9;
      6. var flag = buffer_read(b_temp, buffer_u8);
      7. var chunk_count_body = buffer_read(b_temp, buffer_u32);
      8. var chunk_body = 15;
      9. var chunk_count_index = buffer_read(b_temp, buffer_u32);
      10. var chunk_index = 2;
      11. if(chunk_count_body > $ffff)
      12. chunk_index += 2;
      13. if(flag & $01)
      14. chunk_index += 8;
      15. var mdl_tmp = d3d_model_create();
      16. d3d_model_primitive_begin(mdl_tmp, pr_trianglelist);
      17. for(var i = 0; i < chunk_count_index; i++)
      18. {
      19. buffer_seek(b_temp, buffer_seek_start, head_size + chunk_count_body*chunk_body + i*chunk_index);
      20. if(chunk_count_body <= $ffff)
      21. v_i = buffer_read(b_temp, buffer_u16);
      22. else
      23. v_i = buffer_read(b_temp, buffer_u32);
      24. if(flag & $01)
      25. {
      26. t_u = buffer_read(b_temp, buffer_f32);
      27. t_v = buffer_read(b_temp, buffer_f32);
      28. }
      29. buffer_seek(b_temp, buffer_seek_start, head_size+v_i*chunk_body);
      30. v_x = buffer_read(b_temp, buffer_f32);
      31. v_y = buffer_read(b_temp, buffer_f32);
      32. v_z = buffer_read(b_temp, buffer_f32);
      33. n_x = buffer_read(b_temp, buffer_s8)/127;
      34. n_y = buffer_read(b_temp, buffer_s8)/127;
      35. n_z = buffer_read(b_temp, buffer_s8)/127;
      36. switch(flag)
      37. {
      38. case $00: d3d_model_vertex_normal(b_temp, v_x, v_y, v_z, n_x, n_y, n_z); break;
      39. case $01: d3d_model_vertex_normal_texture(b_temp, v_x, v_y, v_z, n_x, n_y, n_z, t_u, t_v); break;
      40. }
      41. }
      42. d3d_model_primitive_end(mdl_tmp);
      43. buffer_delete(b_temp);
      44. return mdl_tmp;
      Alles anzeigen

      Dies importiert das gmo Modell und man kann es sofort verwenden. Mit buffer_load_async ist es sogar möglich die Objekte in einem Thread zu laden, was das ganze wesentlich beschleunigt. Die Buffer eignen sich für sowas sehr gut. Als Argument gibt man einfach den Pfad des Files an. Wenn sich das Objekt in den Included Files befindet braucht man nur name+".gmo" zu schreiben.

      Erstmal will ich mich bedanken, dass du bis hier hin gelesen hast. Ich habe sehr viel Mühe und Zeit in dieses Projekt gesteckt und hier ist noch lange nicht Schluss. Es ist wichtig, dass ihr noch nicht bekannte Bugs sofort meldet. Verbesserungsvorschläge sind sehr willkommen und auch generell Unterstützung von euch. Ich stelle es euch frei das Addon und das Skript beliebig zu verändern und zu erweitern.

      Anhang:
      io_export_gmo_v0_2.zip Das Addon für Blender
      GMO-Beispiel.zip Ein Beispiel mit Suzanne. Enthält auch einen nicht veröffentlichten Schatten-Shader als Dankeschön.

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

    • Sehr schön, ich habe immer den "3D Model Creator for GameMaker" benutzt, aber dort ist das texturieren schwer bis unmöglich.

      Schön ist, das man nun die Objekte mit Blender machen kann, und diese auch laden kann, mit Textur, wenn ich das richtig verstanden habe.
      Man merkt, das texturieren ist für mich einfach qualvoll <.<

      Wenn ich es brauche, werde ich mich damit zu 100% auseinander setzen und es benutzen, freue mich auf Updates, gerade wenn es hierum geht:
      Bevor wir dazu kommen, müssen wir leider noch das Objekt vorbereiten, damit es auch richtig Exportiert wird. Mein Ziel ist es, diesen Schritt überflüssig zu machen und es automatisch geschehen lasse.


      Gab schon mal ein like ;)

      -Nils
    • Ich habe soeben das Addon geupdatet. Es war zum Glück nicht allzu schwer es zu automatisieren. Einfacher geht es jetzt nicht mehr. Jetzt braucht man nur noch den Export auszuwählen und fertig. Außerdem wird jetzt die globale Matrix mit einberechnet.

      McGamemake schrieb:

      Schön ist, das man nun die Objekte mit Blender machen kann, und diese auch laden kann, mit Textur, wenn ich das richtig verstanden habe.

      Texturen werden natürlich unterstützt und funktionieren auch einwandfrei.

      Ich würde mich über Vorschläge und Wünsche freuen.