3d für Anfänger

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

    • 3d für Anfänger



      Da in diesem Forum wenig über 3d zu finden ist, möchte ich besonders den Anfängern erstmal erklären was 3d ist, wie es funktioniert und wie man es benutzt. Außerdem werde ich zeigen, wie man ein einfaches Top-Down "Spiel" macht, es kann am Schluss dann (z.B) so aussehen.


      1. Z- Achse


      Wer sich etwas mit dem Gamemaker beschäftigt, (oder es aus dem Mathe Unterricht kennt) kennt sicher einen normalen Graphen.
      Er setzt sich zusammen aus X und Y Achse (1). Wenn wir jedoch den 3d-Modus aktivieren, kommt eine neue Achse dazu, die Z Achse. (2, Hellblau)

      [1] [2]



      Die Z-Achse verleiht Objekten eine Höhe, sonst wären sie flach. Der Punkt wo sich alle Achsen treffen nennt man Origin. (Dt. Ursprung)

      2. Den 3d Modus Aktivieren


      Lasst uns doch ein kleines Beispiel für die Benutzung von 3D machen.
      Dafür müssen wir den 3d Modus erstmal aktivieren, wir erstellen also ein Objekt "obj_camera" und schreiben folgendes ins Create Event:

      GML-Quellcode

      1. d3d_start(); //Aktiviert den 3d Modus
      2. d3d_set_perspective(true); //Lässt uns die Kamera-Perspektive verstellen, dazu später.
      3. d3d_set_lighting(false);//Deaktiviert die Benutzung von Lichtern, vorerst brauchen wir keine.
      4. d3d_set_fog(true,c_black,1,1024);//Aktiviert die Benutzung von Nebel, der Nebel startet bei 1, und endet bei 1024.
      5. d3d_set_shading(false); //Aktiviert die Benutzung von Schatteneffekten, zum besseren Verständnis Bild 3 angucken.
      6. d3d_set_culling(false); //Diese Funktion ist erstmal nicht wichtig, Anfänger sollten diese jedoch auf false haben um Probleme zu vermeiden.
      7. z=200; //Wir erstellen noch eine Variable "Z", diese wird nacher wichtig.
      8. draw_set_color(c_white);



      [3]

      Damit wäre der 3d Modus schonmal aktiviert.
      Dann wagen wir uns mal an die Kamera-Perspektive (Draw Event).
      Wir machen vorerst eine Topdown-Sicht die einem Objekt folgt. (Das Objekt nennen wir "obj_player", der Code kommt aber noch in das "obj_camera" Objekt)

      GML-Quellcode

      1. d3d_set_projection(obj_player.x-1,obj_player.y-1,z,obj_player.x,obj_player.y,1,0,0,1); //Die Kamera guckt von der Position des Objekts "obj_player" auf die Position des Objekts "obj_block" also auf zweimal die gleiche Position, deswegen Topdown. Die Variable "z" gibt die Höhe an, von der gesehen wird.

      Wenn man eine 3rd-Person Sicht haben möchte könnte es so aussehen:

      GML-Quellcode

      1. d3d_set_projection(obj_player.x-20,obj_player.y-1,z,obj_player.x,obj_player.y,1,0,0,1);//Die Position der Kamera wird 20 nach hinten gesetzt.


      Man kann jetzt noch in das "Mouse wheel up" Event folgenden Code schreiben.

      GML-Quellcode

      1. z-=8 // Das bedeutet immer wenn man nach oben scrollt, verringert sich die Variable "z" um 8 und die Kamera zoomt näher an das Objekt "obj_player".

      Das Ganze kann man noch andersrum ins "Mouse wheel down" Event packen.

      GML-Quellcode

      1. z+=8


      3. Das Zeichnen

      Das was wir bis jetzt gemacht haben waren nur Einstellungen um dem Gamemaker zu sagen wie wir was aus welches Perspektive (usw.) sehen wollen.
      Jetzt zeichnen wir ein Paar 3-dimensionale Objekte, wir erstellen dafür ein Objekt "obj_floor" und gehen vorerst ins Create Event.

      GML-Quellcode

      1. repeat 20 instance_create(random(250),random(250),obj_block); //Erstellt 20 mal in einem Zufalls Bereich von 250 Pixeln das "obj_block"
      2. tex = background_get_texture(tex_floor); //Wollen wir einen background als textur verwenden, müssen wir diesen Befehl benutzen. In diesem Fall speicher ich die Textur in einer Variable, damit sie nicht jeden Step neugeladen werden muss.

      Weiter geht's im Draw Event.

      GML-Quellcode

      1. d3d_draw_floor(x+200,y+200,0,x-200,y-200,0,tex,6.25,6.25); //So ein Code ist erst sehr verwirrend, aber wer sich in 2D auskennt denkt einfach wieder an unseren Graphen. Wie lassen einen Floor (Dt.: Boden, Im GM eine Fläche) zeichnen. Besser zum verstehen in Bild 4.


      Wir sehen hier ein (gekrikeltes) Koordinatenkreuz wie es jeder von uns kennt. Gucken wir uns den Code und den Graph parallel an, dann sehen wir, dass
      Punkt 1 meiner Krikelei den Koordinaten x-200,y-200 entspricht und Punkt 2 den Koordinaten x+200,y+200.
      das x/y vor den Zahlen legt praktisch den 0-Punkt fest, von dem gezeichnet werden soll, normalerweise ist dieser 0, jetzt ist er die Position unseres "obj_camera" Objektes. Zu den Letzten 3 Variablen des Codes: "tex" ist die Textur, mit der die Fläche überspannt werden soll, wir benutzen die im Create Event deklarierte Variable.


      [4]

      Damit wären wir mit unserer Kamera fertig.
      Wir nehmen jetzt das vorher erstellte Objekt "obj_player" zur Hand.
      Dieses wird unser Spieler Objekt. Lassen wir es zuerst mal zeichnen. (Draw-Event)

      GML-Quellcode

      1. d3d_transform_set_identity();
      2. d3d_transform_add_rotation_z(direction);
      3. d3d_transform_add_translation(x,y,0);
      4. d3d_draw_block(-5,-4,0,+5,+4,5,tex,1,1);//Zeichnet einen Block
      5. d3d_transform_set_identity();


      Da Rotationen nicht ganz einfach zu verstehen sind, gibts es hierzu ein extra Tutorial .

      Damit haben wir einen Block der sich in die Richtung der direction des Objekts dreht, noch ist er aber unbeweglich.
      Ändern wir dies im Step-Event.

      GML-Quellcode

      1. if (keyboard_check(vk_up)){speed=2}else{speed=0}; //Wenn die Pfeiltaste nach oben gedrückt wird, ist die Geschwindigkeit=2 sonst ist sie =0.
      2. if (keyboard_check(vk_left)){direction+=4}; //Die direction ist die Richtung in die unser Objekt guckt, es beweget sich ebenfalls in die Richtung der Variable direction
      3. if (keyboard_check(vk_right)){direction-=4};


      Wenn wir jetzt die Objekte in den Room Editor einfügen und das "Spiel" starten, sollten wir einen beweglichen Block in einer 3d-Welt haben.

      3. Abschließende Worte:

      Ich hoffe ich konnte euch etwas über die leichten Funktionen von 3D im GM beibringen, bei Fehlern oder Ungeschicktheiten meldet euch bitte direkt, denn ich mach auch viele Fehler.
      Wenn ihr das ganze noch etwas ausschmückt, und z.B ein Block Objekt mit zufälliger Höhe erstellt so wie ich hier, könnte es z.B so aussehen:



      Andere Tutorials von mir:

      3d - Effekte
      3d - Outlines
      3d - Modelle
      3d - Beleuchtung
      3d - Transformationen
      3d - Kollisionen
      3d - Partikel

      Farben:
      • Fachbegriffe oder Wichtiges
      • Variablen
      • Events
      • Objekte

      Im Anhang findet ihr die *.gm6 zum Ausprobieren.
      Mfg Moolt.

      Zuletzt aktualisiert am: 24.06.09
      Dateien

      Dieser Beitrag wurde bereits 32 mal editiert, zuletzt von Moolt ()

    • Also ich finde das Tutorial schon mal ganz gut, aber ich habe trotzdem einen Fehler entdeckt:

      GML-Quellcode

      1. d3d_transform_set_identity(); //Wenn es mehrere Rotationen im Spiel gibt werden diese vor dem Zeichnen für diese Objekt deaktiviert. d3d_transform_add_translation(-x,-y,0); //Legt die Rotationsachse fest
      2. d3d_transform_add_rotation_z(direction); //Legt die Rotation Fest. (min 0° max °360). Hier nehmen wir erstmal die direction. d3d_transform_add_translation(x,y,0);
      3. d3d_draw_block(x-5,y-4,0,x+5,y+4,5,tex,1,1)//Zeichnet einen Block
      4. d3d_transform_set_identity();
      Du hast d3d_transform_add_translation(-x,-y,0); als Kommentar ausversehen hintendran gehängt, anstatt das in die nächste Zeile zu ziehen.
      Also muss das so sein:

      GML-Quellcode

      1. d3d_transform_set_identity(); //Wenn es mehrere Rotationen im Spiel gibt werden diese vor dem Zeichnen für diese Objekt deaktiviert.
      2. d3d_transform_add_translation(-x,-y,0); //Legt die Rotationsachse fest
      3. d3d_transform_add_rotation_z(direction); //Legt die Rotation Fest. (min 0° max °360). Hier nehmen wir erstmal die direction. d3d_transform_add_translation(x,y,0);
      4. d3d_draw_block(x-5,y-4,0,x+5,y+4,5,tex,1,1)//Zeichnet einen Block
      5. d3d_transform_set_identity();
    • Ah tut mit Leid, um genau zu sein ist es nur eine Fehlermeldung die man nicht wegklicken konnte, da ein Script sich auf eine nicht vorhandene Textur "tex2" bezogen hat.
      Ich habe es editiert, getestet und erneut hochgeladen, Link wie gehabt im ersten Post zu finden.
    • Ansichtssache: Ich sehe eine Fehlermeldung, die sich endlos viel wiederholt schon als "endlos viele Fehlermeldungen an" ;) . Danke jedenfalls, dass Du das Teil korrigiert hast. Ja, als Grundlage sehr ansehnlich. Mal gucken, vielleicht wage ich sogar einige Versuche mit deinem Tut... ich find's zwar seltsam, dass Du keine GMK gepostet hast, aber schließlich soll das Tutorial ja dabei helfen sowas von der Grundlage her seblstständig zu erlernen.
    • ToWe schrieb:

      Aber sga mal, wie kann man denn andere Objekte als diese Geometrischen Teile in 3D machen?
      Am einfachsten ist es, Models mit einem Programm (kostenlos: "Anim8or") zu entwickeln und diese z.B. via "Marzipan" in GML-Code umzuwandeln. Wenn ich richtig informiert bin, gibt es für den "Anim8or" sogar ein Plugin, das es ermöglicht, nach GML zu exportieren.
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Jap, ist ein Programm.
      Hier kannst du es downloaden.

      Tut mir Leid ich hatte den Link vorher nicht überprüft.
      *In Moolt's magischer GM Kiste wühl* Ah, das isses' ja. >Link<

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Moolt ()

    • Tolles Tutorial, was ich etwas vermisse sind Links zu weiteren oder weiter führenden Sachen.
      Ich kann nur bestätigen, daß die 3D-Funktionen vom Game Maker nicht sehr weit reichen. Also nicht viel weiter, als hier beschrieben.

      Man kann aber sehr wohl mit dem Game Maker recht viel in 3D machen, wenn man externe libs zum Beispiel Ultimate3D verwendet.
      Die Mühe lohnt sich, wenn man ernsthaft vorhat, z.B. ein 3D-Spiel zu fabrizieren, aber das ist dann halt auch nicht mehr für Anfänger!
      Ich zum Beispiel hatte lange Probleme mit Rotationen, weil der Game Maker keine Matritzen unterstützt. Am Ende hatte ich endlich ein Example gefunden, das mithilfe von Quaternion-Mathematik einen simplen Basiswechsel so unglaublich langsam berechnet hat, daß bei 2-3 Instanzen schon nichts mehr ging.
      Falls Ihr Euch fragt, was der da labert: Gemeint ist der Wechsel in ein anderes Koordinatensystem. Das ist z.B. wichtig für Fahr- und Flugzeuge.
      Diese sachen in GML berechnen zu lassen, ist einfach pervers langsam.

      Ich habe übrigens auch Animator - Marzipan - GMLcode probiert. Auch damit war ich nicht sehr glücklich.
      Wenn Du schon 3D-Models hast (und mit Animator geht das schnell), dann nimm Ultimate3D. Schau Dir in Ruhe die Examples an. Alternativ kursieren auch Irrlicht für GM und Extreme3D, damit kenne ich mich nicht so aus. Aber U3D funktioniert sehr gut.
    • Thread auf Wunsch des Autors geschlossen.

      //EDIT von Bottleneck: Auf erneuten Wunsch des Autors wieder offen
      Hier werden sie geholfen:
      [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
      [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


      "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
      "Selber denken regt das Gehirn an."
      - Niffel f.k.a. Kilik
    • Das Tutorial ist wieder geöffnet, hauptsächlich aus dem Grund dass ich noch einige Sachen verbessern und ergänzen wollte.
      Fragen die sich auf das Tutorial beziehen können hier gerne gefragt werden, für Off-Topic Angelegenheiten bitte den "Smalltalk" oder "Technische Fragen" zu benutzen.

      Moolt
    • Schönes Tut! Sicher sehr gut für Anfänger!

      Aaaaaber ich hab' einen kleinen Fehler im Code entdeckt:

      GML-Quellcode

      1. if (keyboard_check(vk_up)){speed=2}else{speed=0} //Wenn die Pfeiltaste nach oben gedrückt wird, ist die Geschwindigkeit=2 sonst ist sie =0.
      2. if (keyboard_check(vk_left)){direction+=4} //Die direction ist die Richtung in die unser Objekt guckt, es beweget sich ebenfalls in die Richtung der Variable direction
      3. keyboard_check(vk_right)){direction-=4}


      Würd ICH so machen: :D

      GML-Quellcode

      1. if (keyboard_check(vk_up)){speed=2}else{speed=0} //Wenn die Pfeiltaste nach oben gedrückt wird, ist die Geschwindigkeit=2 sonst ist sie =0.
      2. if (keyboard_check(vk_left)){direction+=4} //Die direction ist die Richtung in die unser Objekt guckt, es beweget sich ebenfalls in die Richtung der Variable direction
      3. if (keyboard_check(vk_right)){direction-=4}


      :)
      fabse64 -> haiyyu
    • Dumme Frage:

      Wo soll ich den Code hin schreiben? Ich weiß dass man das eigentlich kapieren solte was Create Event ist, aber ich habe mich noch nicht sehr lange mit Game Maker befasst.

      Wo gibt es denn da ein Fenster wo man das rein schreiben kann?
      Am Anfang standen wir vor einem Abgrund...

      jetzt sind wir schon einen großen Schritt weiter