3D Objekte in GM Studio

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

  • 3D Objekte in GM Studio

    Hallo zusammen!

    Nach langer Zeit mache ich mal wieder im GM herum. 2D mäßig dachte ich, so manches zu beherrschen und nun wollte ich ein paar Sachen in 3D teste. Es stellt sich nun aber heraus, dass ich damit ziemlich rasch überfordert bin.

    Was ich machen will: Selbst erstellte, meist einfache 3D Objekte wie Würfel, Torus etc. in bestehende 2D Szenen laden und diese nach Vorgabe (Pfad, programmiertes rotieren) bewegen lassen. Völlig ohne Interaktion mit der 2D Umgebung oder Zutun des Spielers.

    Was ich habe: Abgesehen vom 3D-Objekt, welches ich in D3D konvertiert habe, habe ich das 3D mit folgendem Code initiiert:

    GML-Quellcode

    1. d3d_start();
    2. d3d_set_perspective(true);
    3. d3d_set_lighting(false);
    4. draw_set_color(c_white);
    5. d3d_set_fog(false,c_black,1,128);
    6. d3d_set_culling(false);
    7. d3d_set_shading(false);
    8. texture_set_interpolation(true);


    Wenn ich nun im Draw ein Objekt zeichne, sehe ich auch etwas, auch wenn es noch furchtbar aussieht. Aber das D3D Objekt, welches ich laden will, sehe ich nicht. Hier der Code:

    Create:

    GML-Quellcode

    1. scr_3dinit();
    2. x=0;
    3. y=0;
    4. z=0;
    5. cube = d3d_model_create();
    6. d3d_model_load(cube, working_directory+"\models\cube.d3d")
    7. cube_text = background_get_texture(bg_cubetext)


    Draw:

    GML-Quellcode

    1. d3d_set_hidden(true);
    2. draw_set_color(c_white)
    3. draw_set_alpha(1)
    4. d3d_model_draw(cube, x, y, 0, cube_text)


    Nun weiß ich aber nicht, ob etwas am Code oder am Objekt nicht stimmt. Hat mir dazu einer Ratschläge? Und wenn ich das Objekt mal sehe, wie kann ich es per Code bewegen?
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Hast du das Modelfile bei "included Files" drinne? Weil wenn du beim Pfad working_directory angibst, landest du doch in "C:\Users\Username\AppData\Local\Spiel" oder nicht? Wenn du die Datei in included Files drin hast, brauchst beim Pfad nur Dateiname mit Endung angeben.
  • In der Zwischenzeit habe ich es Mal mit einem Exporter für Blender versucht: martincrownover.com/blender-addon-gm3d/

    Man bekommt eine TXT Datei, die man als Script in Blender einbindet. Soweit, so gut. Das Script heißt bei mir scr_cube und sieht inhaltlich so aus:

    Spoiler anzeigen
    var temp = d3d_model_create();
    d3d_model_primitive_begin(temp,pr_trianglelist);
    d3d_model_vertex_normal(temp, 1.000000, 1.000000, -1.000000, 0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -1.000000, -1.000000, 0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, -1.000000, -0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -0.999999, 1.000000, 0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 0.999999, 1.000001, 1.000000, 0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -0.999999, 1.000000, 0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -1.000000, -1.000000, 0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, 1.000000, -1.000000, 0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, 0.999999, 1.000001, 1.000000, 0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, 1.000000, -1.000000, 0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, -1.000000, -0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, -1.000000, -0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, -1.000000, -0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -1.000000, -1.000000, 0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -0.999999, 1.000000, 0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, 1.000000, -1.000000, 0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, -1.000000, -0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, -1.000000, -0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 0.999999, 1.000001, 1.000000, 0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, 1.000000, -0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -0.999999, 1.000000, 0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, 1.000000, -1.000000, 0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, 0.999999, 1.000001, 1.000000, 0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 0.999999, 1.000001, 1.000000, 0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, -1.000000, -0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, 1.000000, -0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, -1.000000, -0.577349, 0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, 1.000000, 1.000000, -0.577349, 0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, 1.000000, -1.000000, -1.000000, 0.577349, -0.577349, -0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, 1.000000, -0.577349, -0.577349, 0.577349, );
    d3d_model_vertex_normal(temp, -1.000000, -1.000000, -1.000000, -0.577349, -0.577349, -0.577349, );
    d3d_model_primitive_end(temp);
    return temp;

    GML-Quellcode



    Es ist nur ein Würfel. :D

    Im Create des Objekts habe ich es so (und 1000 andere Varianten) versucht, aber man sieht noch immer... nichts:

    GML-Quellcode

    1. cube = d3d_model_create();
    2. d3d_model_load(cube, scr_cube());
    3. cube_text = background_get_texture(bg_cubetext);


    ;(
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Problem erkannt, Problem fast gebannt. Das mit dem Blender-Export funktioniert nun. Das Problem war, dass die Koordinaten zu eng beisammen waren bzw. der Würfel zu klein. Nun fummel ich noch an Licht und anderen Dingen und wenn ich mal einen drehenden Würfel habe, stelle ich das hier komplett als Lösung rein. ;)
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Hier ist nun das Beispiel. Der Würfel rotiert vor der Kamera und wird immer wieder kurz groß und dann klein. Wer möchte, kann das natürlich noch weiter optimieren. ;)
    Dateien
    • 3d-Objekt.gmx.zip

      (198,97 kB, 353 mal heruntergeladen, zuletzt: )
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Noch ein paar Ergänzungen. Mir ist aufgefallen, dass der Würfel schwarz ist, wenn man ihn mit 2D Sachen mischt. Das liegt daran, dass ich vergessen habe in der BG-Textur "Used for 3D" anzuklicken.

    Außerdem wollte ich, dass ich im Hintergrund einen 2D Effekt habe und sich davor der Würfel bewegt. Hier ein Beispiel, wie man das lösen kann:

    Draw-Event von obj_cube:

    GML-Quellcode

    1. d3d_set_lighting(true); // Licht an, sonst ist das 3D schwarz
    2. draw_set_color(c_white);
    3. draw_set_alpha(1);
    4. d3d_transform_set_identity();
    5. d3d_transform_add_rotation_x(rot_x);
    6. d3d_transform_add_rotation_y(rot_y);
    7. d3d_transform_add_rotation_z(rot_z);
    8. d3d_transform_add_scaling(scale, scale, scale);
    9. d3d_transform_add_translation(x, y, 0);
    10. d3d_transform_add_translation(view_wview[0] / 2, view_hview[0] / 2, z);
    11. d3d_set_hidden(false); // sonst erscheint das Objekt hinter dem 2D!
    12. d3d_set_culling(true); // an, sonst sieht man durch die Polygone
    13. d3d_model_draw(cube, view_wview[0] / 2, view_hview[0] / 2 , z, cube_text);
    14. d3d_set_culling(false); // aus, sonst sieht man das 2D nicht mehr
    15. d3d_transform_set_identity();
    16. d3d_set_lighting(false); // Licht aus, sonst ist das 2D schwarz
    Alles anzeigen
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Beim Blender sind die Units größer als beim GM und die Y Achse ist oben und gespiegelt, dh wenn du was anderes als einen Würfel in den GM lädts kriegst du dann Probleme in welche Richtung dein Model schaut und du musst es irgendwie vergrößern. Dh empfehle ich dir GMModelFix. Dort kannst du das Model schonmal in die richtige Größer, Spiegelung etc bringen, die normals und die Textur nochmal überprüfen und dann ins d3d Format abspeichern.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)