2D to 3D

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

    • Hallo,

      ich habe folgendes Problem: Ich möchte möglichst einfach 2D Koordinaten in 3D Koordinaten umrechnen, um so eine Art Fake-3D zu bekommen. Ich will kein komplettes 3D Spiel machen, sondern ich will nur die Bewegungen des Spielers - die normalerweise ganz einfach hoch-runter und links-rechts laufen - mit einer Art Perspektive versehen, so dass es so aussieht, als würde man sich im Raum bewegen. Die Hintergründe und Sprites bleiben alle 2D. Nur das Spieler-Sprite sollte sich dann auch noch passend zur Positon im Raum skalieren. Ich möchte also sozusagen die 2D Bildschirmdraufsicht leicht kippen, wie ein Schachbrett, das vor einem liegt. Dieses Bildchen zeigt, was ich meine:

      directupload.net/file/d/3953/a6bhos6x_jpg.htm

      Am Besten wäre es, wenn ich eine Funktion haben, der ich die X- und Y-Koordinaten geben und diese Funktion berechnet mir daraus einfach die neuen X- und Y-Koordinaten. Also wohl eigentlich eine Koordinaten-Transformation.

      Hat das jemand schon mal gemacht? Oder hat jemand ne Idee, wie man das am einfachsten macht? Es geht mir dabei auch hauptsächlich um die Formeln, weil ich davon - trotz früherem Mathe Leistungkurs ;( - keinen Plan mehr habe und das wohl ziemlich lange dauern würde, mich da wieder reinzuhacken.

      Also wäre super, wenn mir jemand helfen könnte :)
    • Das was du da beschreibst, wurde früher bei z.b. dem Super Nintendo und dem Gameboy Advance genutzt.
      Das sind ja Systeme die so kein 3D können, trotzdem "3D" Spiele wie Mario Kart haben.

      Sie benutzen dafür ein ganz einfaches System, auf dem Super Nintendo auch "Mode 7" genannt.
      Mode 7 sorgt dafür Bilder zu drehen, zu skalieren und sonstwas damit zu tun um 3D Bilder zu erstellen, so wie z.B. die Karte von "A link to the past"



      Ja, ich habe das schon einmal gemacht, wollte unbedingt mal ein eigenes Mario Kart machen q:

      Such einfach mal ein wenig nach "Gamemaker Mode 7", da gibt es einiges in der englischen GMC:

      Gm Mode 7: gmc.yoyogames.com/index.php?showtopic=320924

      Thesnidr's Mode 7: http://gmc.yoyogames.com/index.php?showtopic=446025

      Faux Mode 7 Example: http://gmc.yoyogames.com/index.php?showtopic=396566

      Jedenfalls wäre das schon mal ein Ansatz dafür.
      Es gibt bestimmt noch andere Lösungen, allerdings ist das so einer der bekanntesten.

      P.s. Mache vielleicht bald mal ein Tutorial dazu.

      -Nils
    • Eine weitere Möglichkeit wäre eine Ansicht wie in Hyper Light Drifter :

      Dafür würdest du dann den Spieler ganz normal auf der x-Achse für links/rechts bewegen und auf der y-Achse um nach vorne oder weiter in den Raum rein zu gehen. Um dann die z Achse zu simulieren erstellst du eine variable z. Den Spieler malst du dann so :

      GML-Quellcode

      1. draw_sprite(sprite_index,image_index,x,y+z);

      Hoffe es ist verständlich wie ich das meine. Dazu gibt es wahrscheinlich auch dutzend mehr Tutorials und da könnte ich dir aufjedenfall auch weiterhelfen.

      Im Endeffekt kommt es sich aber darauf an was dir mehr gefällt, desshalb werde ich jetzt erstmal nicht tiefgründiger drauf eingehen.
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • Danke schon mal für die beiden Antworten.

      Das Zweite (Hyper light Drifter) ist wohl zu einfach, wenn ich das richtig verstehe. Ich möchte halt auch die perspektivische Verzerrung beim Bewegen. Also wenn ich mich mit Y in die Tiefe bewege, muss sich auch die X-Position verschieben, weil ich mich ja immer mehr dem Fluchtpunkt nähere, je weiter ich in den Raum rein gehe.

      Das mit dem "Mode 7" von Gametrickster ist schon genau das Richtige. Allerdings viel komplizierter, als ich es brauche. Ich habe mir die geposteten Links schon mal angeschaut und muss die ganzen Inforamtionen dort erst mal Auswerten und die Scripte auch erst mal zum Laufen bringen und ausprobieren. Viele der Sachen sind auch schon so alt, dass die Links dort gar nicht mehr funktionieren :(
      Diese "Mode 7" Geschichte hat viel mehr, als ich brauche. Ich brauche keine flexible Kamera, keine Texturen oder Objekte. Auf jeden Fall ist das schon mal ein guter Ansatz und ich versuche jetzt dort zu finden, was ich brauche.

      Aber vielleicht gibt es ja noch jemanden, der da Tips und vielleicht schon eine aufbereitete Lösung hat.
    • Wenns dir wirklich nur darum geht quasi so ein "Brett" mit perspektivischer ansicht zu haben, dann kannst du das ganz simpel in ein paar minuten (auch ohne Vorkenntnisse, nur durch Tutorials) mit den 3D funktionen bewältigen. Du lässt einfach einen floor malen mit deiner Textur und mit d3d_set_projection_ortho solltest du dann eine Kamera mit gegebener perspektive erstellen können. Die Musst du einfach auf dein Brett ausrichten und voila, fertig. Den Rest kannst du dann ganz einfach mit den 2d sprites machen.
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • Hab jetzt glaube ich gefunden, was ich brauchte. Hab mal ein bisschen in den "Mode 7" Scripten von Thesnidr rumgestöbert, die Gametrickser gepostet hat. Und ein paar Funktionen dort, machen genau das, was ich wollte. Bei ersten Tests hats schon ganz gut funktioniert.

      Mit den D3D Funktionen von Game Maker kenne ich mich überhaupt nicht aus und wollte das eigentlich auch vermeiden. Aber wenn du meinst, dass das so einfach ist, werde ich mir das auch mal anschauen. Hab da irgendwie die Befürchtung, dass ich damit viel mehr in das Spiel einbauen würde, als nötig...aber wie gesagt, ich hab da auch keine Ahnung...

      Auf jeden Fall Danke euch Beiden!
    • effektiv würde ich jetzt 10-20 zeilen code MAXIMAL einschätzen dafür wenn du das mit d3d bewältigst. Aber guck dir gerne in Ruhe alles an und lerne draus. Dann kannst du Entscheiden was du brauchst/magst und selber umsetzen :)
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • Jup, die d3d Funktionen würde ich dafür auch empfehlen, das ist einfacher als kompliziert Mode7 zu reverse engineeren. Ein weiterer Ansatz von mir wäre, wenn du der Challenge wegen auf d3d verzichten willst wieder mal das gute lengthdir.

      Je weiter dein Fluchtpunkt entlang der y achse weg ist desto weniger wird die Verzerrung. Dein Charaker bewegt sich mit den Lengthdir funktionen auf einem Kreisbogen auf Höhe des radius. Das heißt dein Charakter geht von links nach rechts in einem leichten bogen und von oben nach unten diagonal bis vertikal. Dadurch hast du einen netten Fisheye effekt.
      Als y position im Raum gibst du die Länge in der Lengthdir funktion an, also entweder näher beim Fluchtpunkt oder näher an der Kamera. Die x position kommt heraus wenn du den Winkel der lengthdir funktion änderst. Du musst dabei lengthdir_x und lengthdir_y mit den gleichen Werten verwenden.

      Das gilt dann für eine Bewegung im fisheye stil, es ist aber dann umso schwerer auch noch die Textur daran anzupassen, dass die dementsprechend verzerrt ist. draw_sprite_pos() würde da gehen, die 4 eckpunkte die das trapez ausmachen müsstest du dann wieder mithilfe der lengthdir funktionen angeben. aber draw_sprite_pos is buggy und funktioniert deswegen nur für ganzfärbige flächen gut, ansonsten hast du einen knick in der textur.

      dosketch.com/view.php?k=L4UfZjT2YgKAlAQOimsl
      ich hab kurz was gesketeched

      dazu muss ich sagen, ich rate von meiner methode ab XD es sei denn du willst einen sehr eigen und einzigartigen effekt haben

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • Das mit der Bewegung im fisheye stil, hat was, könnte ich mir ganz gut vorstellen, aber da wag ich mich lieber nicht ran. Wer weiss, was da dann später alles für Probleme auftreten...kann im Moment noch gar nicht überlicken, wo genau ich hin will.

      Also wegen Challenge verzichte ich ganz sicher nicht drauf, eher im Gegenteil! ;) Will halt einfach nur die Konrtolle über alles haben und nicht Dinge benutzen, die ich nicht verstehe.
      Wie gesagt, ich hab nur mal kurz einen Blick auf die D3D Funktionen geworfen und hab da keine Ahnung von...bin aber neugierig geworden. Wenn das so einfach ist und nur ein paar Zeilen Code braucht, könntet ihr dann nicht einfach mal auf die Schnelle so ein Code-Beispiel zusammenbasteln, das das macht, was ich will und hier posten? :whistling: Natürlich nur, wenns keine Umstände macht...
    • Könnten wir natürlich, aber davon lernst du ja nix.
      Guck dir einfach part 1 eines beliebigen guten FPS tutorials an. Auch wenn das erstmal von der thematik her garnichts damit zu tun hat wird da immer :
      1) Ein simpler floor erstellt (das was du willst, dein brett)
      2) Die Kamera erstellt (das willst du auch, nur das du den bewegungspart rauslassen kannst, willst ja nur eine fixe Einstellung verwenden die auf den Boden dann gerichtet ist)

      Viel Spaß :D ^^
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    • EDIT: Rhazul hat natürlich Recht, ich hab trotzdem schnell was zusammengeschrieben und auskommentiert du musst aber wohl mit den Werten rumexperimentieren weil ich habs nicht getestet, damit du alles funktioniert und sichtbar ist.

      Aso, ja klar^^

      Also du musst den 3D modus ab dem Moment wo er genutzt werden sollaktivieren und am besten am Ende auch wieder deaktivieren.

      Create(kamera):

      GML-Quellcode

      1. d3d_start();
      2. d3d_set_culling(true);//damit wird nur die Vorderseite von deinen Objekten gedrawed und von der anderen seite sind sie durchsichtig
      3. d3d_set_perspective(true); perspektivische Verzerrung einschalten
      4. x = 512;
      5. y = 512;
      6. z = 32;
      7. direction = 90;//je nachdem in welche richtung du im Raum schauen möchtest, das ist nach oben in 2d und vorwärts in 3D entlang der y achse also
      8. dirz = 0; //ein wert mit dem du das Nicken der Kamera bestimmst, also ob du richtung boden oder decke schaust
      9. camx = 0; //variablen die später befüllt werden umd die kamera ausrichtung zu bestimmen
      10. camy = 0;
      11. camz = 0;
      12. fov = 90; //blickwinkel
      13. aspectratio = 16/9; //kann auch 4/3 oder 1/1 sein je nachdem was du brauchst
      Alles anzeigen


      Game End(kamera):oder wenn du in einen reinen 2d Raum wechselst

      GML-Quellcode

      1. d3d_end();


      Draw(kamera): hier passiert nun das wichtigste

      GML-Quellcode

      1. camx = x+lengthdir_x(96,direction); //mit dem Wert 96 kannst du dich spielen, dann siehst du wie sich das auf das Bild auswirkt udn was am besten ist.
      2. camy = y+lengthdir_y(96,direction); //direction schwenkt die amer anach links udn rechts
      3. camz = z+dirz; /7zdir nach oben und unten
      4. d3d_set_projection_ext(x, y, z, camx, camy, camz, 0, 0, 1,fov,aspectratio,1,16000)
      5. //die 3D projektion von deiner x,y,z position, blickend auf die zielkoordinaten deiner kamera, rotierend um die zachse, mit fov, aspectration und
      6. //es wird nur gezeichnet was weiter als 1 von der kamera entfernt ist, sonst flackerts
      7. //und alls was weiter als 16000 entfernt ist wir dnciht mehr gedrawed
      8. d3d_set_projection_ortho(x, y, 1920, 1080, 90);
      9. //orthografische projektion für alles was du im HUD angezeigt bekommen willst, also nicht 3D sein soll
      10. draw_set_color(c_white);
      Alles anzeigen


      So das war die kamera, nun noch dein Level drawen lassen, ich pack das hier mal in ein Objekt hinein.
      create(level):

      GML-Quellcode

      1. floortex = sprite_get_texture(spr_floor,0);//bei dem sprite muss used for 3D angehakt sein im Sprite editor
      2. walltex = sprite_get_texture(spr_floor,0);//bei dem sprite muss used for 3D angehakt sein im Sprite editor

      draw(level)

      GML-Quellcode

      1. d3d_draw_floor(0,0,0,1024,1024,0,floortex,2,2)//draw einen floor auf höhe 0 und wiederhole die Textur 2x die über den floor gestreckt wird
      2. d3d_draw_wall(224,768,0,256,768,48,walltex,1,1)


      Mit den genauern werten musst du dich natürlich spielen weil ich das jetzt nicht überpüfen kann ob du die wand sehen würdest. Dein Spieler wäre dann auch so eine wall und den verschiebst du dannn im raum herum.
      Du musst nur aufpassen das das sprite used for 3d angehakelt udn eine 2er potenz als größe hat.

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