3D - Sprite nach der Kamera ausrichten

  • GM 8

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

  • 3D - Sprite nach der Kamera ausrichten

    Hallo Leute!

    Ich habe ein kleines Problem das ich nicht lösen kann. (zumindest nicht mitmeinem derzeitigen Wissen.)

    Ich habe im 3D Modus immerwieder Probleme im 3D Modus. Jeder von euch kennt doch das FPS Tutorial von yoyogames.
    Dort sind die Objekte wie Bäume und Fässer kein 3D Objekt sondern ein eigenes Sprite. Dabei wird das Sprite immer in Richtung der Kamera ausgerichtet.

    Das Problem ist nun dass, das ich nicht genau weiss wie ich das Sprite in Z- Ebene zur Kamera ausrichten kann. (Wenn ich z.B: mit meiner Kamera in der Z-Ebene etwas höher gehe, soll sich das Sprite eben zur Kamera ausrichten.) Versteht ihr mein vorhaben?

    im Yoyogames example sah der Code etwa so aus:

    GML-Quellcode

    1. var tex;
    2. tex = sprite_get_texture(spr_treel,0);
    3. d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,20,x+7*global.camsin,y+7*global.camcos,0,tex,1,1);


    Das Problem ist wohl eher dass, das ich nicht wirklich verstehe wie die Kameraberechnung per Sinus und Cosinus funktioniert. (Ich haber in der Schule dammt zwar viel gearbeitet, verstehe das vorhaben im GM aber nicht.)
  • LEWA schrieb:

    Das Problem ist wohl eher dass, das ich nicht wirklich verstehe wie die Kameraberechnung per Sinus und Cosinus funktioniert. (Ich haber in der Schule dammt zwar viel gearbeitet, verstehe das vorhaben im GM aber nicht.)
    Da sich anscheind keiner Meldet, versuche ich mal, dir bei deinen Hauptproblem zu helfen. . . der Projektion.
    Wenn du die Projektion nicht verstehst solltest du dir den Code noch einmal genauer anschauen:

    GML-Quellcode

    1. // set the projection
    2. d3d_set_projection(x,y,10, x+cos(direction*pi/180),y-sin(direction*pi/180),10, 0,0,1);


    Was haben wir denn da?

    [xfrom,yfrom,zfrom] => [x,y,10]
    Wir gucken also von dem Punkt (x,y,10) in die Welt. x,y sagt uns, das wir nunmal, wie sollte es auch anderes sein, von dem Punkt des Spielers aus in die Welt gucken, und die 10 bedeutet nichts weiter als 10 Einheiten über den Boden.

    [xto,yto,zto] => [x+cos(direction*pi/180),y-sin(direction*pi/180),10]
    Fangen wir mit den einfachen an: zto => 10
    Wenn wir also von (zfrom) 10 Einheiten über den in die Richtung 10 Einheiten über den Boden gucken, haben wir eine grade, was nichts anderes bewirkt als das der Spieler grade guckt (und nicht nach oben oder unten geneigt).

    Gucken wir uns nun die neuen x und y Werte an, in welche Richtung wir gucken wollen:
    x+cos(direction*pi/180),y-sin(direction*pi/180)

    Das sieht aber erstmal schlimmer aus als es eigentlich ist.
    Frage dich: Was macht cos/sin? Was hat pi mit cos/sin zutuen? Was ist eigentlich die direction eines Objektes genau?

    Was ist eigentlich die direction eines Objektes genau? Ein Wert zwischen 0-360(359) . . . also wenn ich es nicht besser wüsste würde ich glatt sagen ein Winkel!

    Was macht cos/sin? Hierzu wäre der Wikipedia Artikel wie ich finde eine gute Lösung. Beim klicken auf diesen Link kommst du gleich zur richtigen stelle.

    Zu guter letzt die Frage: Was hat pi mit cos/sin zutuen?
    pi hat insofern was mit den beiden Funktionen zu tuen, als das die Sinuskurve immer bei x=vielfaches von pi eine Nullstelle hat, und die Kosinuskurve immer bei x=vielfaches von pi ein Extremwert hat. Deshalb wäre es doch einfach immer in pi zu Rechnen, anstatt in Grad.
    Das würde also wiederum bedeuten das pi = 180° entspricht, denn sin(180)=0 und cos(180)=-1 und 2pi demnach = 360°. Diese Methode der Winkeldarstellung nennt man Radiant. Die umrechnung, von Winkel in Radiant ist x*pi/180, da pi=>180° ist. Es gibt eine sehr sehr schöne svg dazu bei Wikipedia, siehe hier. Und eine bessere als meine eigene Erklärung gibt es auch, auf mathe-online.at.

    So nun nochmal unsere beiden Werte von xto,yto:
    x+cos(direction*pi/180),y-sin(direction*pi/180)
    Nun können wir also sagen, dass wir den Winkel von Grad in Radiant umrechnen, und von diesem den (Ko)Sinus berechnen. Da das Ergebnis immer zwischen 1 und -1 ist, wird unserer (da wir uns im Kreis mit dem Mittelpunkt x,y befinden) xfrom nach xto und yfrom nach yto immer nur um 1 oder -1 Einheiten entfernt sein. Also einfacher gesagt:
    Der Spieler ist im Mittelpunkt eines um ihn nicht sichtbaren Kreises. Von seiner Position (2D gesehen: x,y) aus guckt er in die Richtung x,y +/- (0 <= x <= 1), und sieht dadurch aber natürlich alles in dieser Richtung. (Du kannst zumbeispiel wenn du dich drehst auch weiter Entferntes von deinem Zimmer sehen, auch wenn du nur Beispielsweiße ein Finger vor deine Augen hällst, und zu diesem schaust).

    Und dann wären da noch xup,yup,zup:
    Ehrlich gesagt weiß ich selber nicht was das ist, da ich 3D Funktionen eigentlich nicht benutzte.


    Ich hoffe du verstehst die Projektion nun so einigermaßen.
    Nun zu den Pflanzen:

    Sie benutzten den Wert von dem Spieler sind also in Abhängigkeit von seinem derzeitigen Winkel (direction). x,y sind auch hier wieder der Mittelpunkt der Pflanze. Sie richten sich nun genau zum (Ko)Sinus des Spielers aus, und dadurch werden von ihrer momentanen Position (x,y) die Ecken für die Wand bestimmt - denk dran d3d_draw_wall <- ein Viereck! Was nur durch den Transparenten Sprite wie eine unebene Fläche aussieht.
    Also etwas besser gesagt: Wieder ein 2D Raum den Wir uns vorstellen, oder nur einen 1D Raum, die x-Koordinate:
    x
    Nun wird der Sinus Wert (welcher min(-1) und max(1))*7 also min(-7) max(7) dazu addiert (gehen wir mal von -7 aus, -*(-7) => +7):
    x-------
    und das gleiche passiert nochmal umgekehrt, da sich bei der x2 Position das Vorzeichen wechselt: (eine Reihe dadrunter steht x-camsin, anstatt x+camsin, somit wird ja aus -7 => -7)
    -------x-------

    Das gleiche passiert nun auch für den y Wert, damit erhälst du ein Viereck, welches den Spieler gegenüber gestellt wird. Die größer über den Boden, wird durch die z-Achse, welche Festgelegt ist (0->24) dargestellt.

    Somit wird also für die Pflanze immer anhand der sin/cos Funktionen des Spielers, den Spieler entgegengestellt, da man die Ecken berechet, und in dem entstehenen Viereck dann das Transparente Sprite als Textur einfügt.



    So ich hoffe es war einigermaßen verständlich, auf Korrektheit natürlich keine Garantie, benutzte diese Funktionen so gut wie gar nicht.

    Gruß,
    Mokuyobi
    木曜日 (Mokuyōbi)
  • Hallo,
    möchte dazu auch was eintragen.
    Die 3D Darstellung (in den 3D- Game´s) basiert auf der Vektor- Mathe.
    Entscheidens Rechtswinkel- System hat sich dafür etabliert.
    Die Vektor- Darstellung wurde in Skalar… umgewandelt … dies ergibt den sin, cos, … „Kram“…. - Egal.

    Original Tut - von John J.A.H. Weeren.

    Original:

    Und meine Änderung für die Z- Ausrichtung

    Geaendert:


    Gruß
    Georg
  • @ georg:

    Danke dass du dich dir die mühe gemacht hast das example noch zu bearbeiten, jedoch ist das was du da hochgeladen hast nichgt genau das, was ich gemeint habe. Bei dir steigen die Bälle mit der Kamera in die höhe.
    Ich jedoch möchte, dass die Bälle (wenn ich z.B: springe und ich über ihnen bin) sich immernoch der kamera zudrehen. Also muss ich es noch schaffen eine Rotation auf der Z-Ebene hinzubekommen.

    für die X und Y Koordinaten sthen ja der Sinus und Cosinus zur verfügung. Was kann ich aber für die 3te Rotation auf der Z-Ebene Nutzen?
  • tut mir leid, jedoch werden die Partikel nicht nach den 3 Achsen ausgerichtet (zumindest fand ich keine die das tun.) gehe z.B: mal nah ans feuer und schau "von oben" auf die Partikel. Zwar wird die x und y Achse dem Spieler zugewandt, aber die Z-Acshe bleibt immer gleich.

    Falls einige von euch Mario Kart DS gespielt haben: Auf der "Pinball" Strecke werden ja diese Pinnball Kugeln abgeschossen um die Spieler beim Fahren zu behindern.
    Einige schlaue Füchse haben sicher durchschaut das Die Kugel nicht aus Polygonen besteht. Das ist ein einfaches Sprite das sich immer der Kamera zudreht und dadurch eine "runde" Kugel simuliert.

    Genau diesen Effekt möchte ich im GM erzielen.
  • Hallo,
    jetzt habe ich verstanden :?: um was es geht.
    In Draw Methode des Bal- Obj.:

    Quellcode

    1. {
    2. var ss,cc,tex;
    3. tex = sprite_get_texture(text_bal,0);
    4. ss = sin(obj_player.direction*pi/180);
    5. cc = cos(obj_player.direction*pi/180);
    6. d3d_draw_wall(x-7*ss,y-7*cc,14,x+7*ss,y+7*cc,0,tex,1,1); // ... 14 wie auch die ... 0 ev. anpassen
    7. }


    wobei;
    text_bal – dein Bal Sprite ist, und
    obj_player – player Obj. … Camera …Objekt ist.

    Gruß
    Georg
  • Benutzer online 1

    1 Besucher