3D Ellipsoid in 3D Game um den Player rotieren

  • GM 8
  • Ich nutzte immer diese 2 Befehle

    GML-Quellcode

    1. xx=x+cos((direction)*pi/180)*32; //Die *32 sind für den Abstand also in dem Fall 32Pixel
    2. yy=y-sin((direction)*pi/180)*32


    xx und yy ist die x und y position für deine Sonne.
    Du must dann die werte weiter geben an dein Sonnen objekt.

    Zum drehen bekommst du es in dem du den Planeten drehst. Wenn sich die Sonne aber anders als der Planet drehen sol gibst du an statt dirction deine eigen Variable ein.
    zb sun_dir
    Dies variable mus ich dann wie die Direction verhalten.
    Die geschwindigkeit regulierst du dann hier mit.
    if sun_dir<360 then sun_dir+=1 else sun_dir=0
    die 1 ist die geschwindigkeit
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • x-sascha schrieb:

    Ich nutzte immer diese 2 Befehle

    GML-Quellcode

    1. xx=x+cos((direction)*pi/180)*32; //Die *32 sind für den Abstand also in dem Fall 32Pixel
    2. yy=y-sin((direction)*pi/180)*32


    xx und yy ist die x und y position für deine Sonne.
    Du must dann die werte weiter geben an dein Sonnen objekt.

    Zum drehen bekommst du es in dem du den Planeten drehst. Wenn sich die Sonne aber anders als der Planet drehen sol gibst du an statt dirction deine eigen Variable ein.
    zb sun_dir
    Dies variable mus ich dann wie die Direction verhalten.
    Die geschwindigkeit regulierst du dann hier mit.
    if sun_dir<360 then sun_dir+=1 else sun_dir=0
    die 1 ist die geschwindigkeit
    Aber ist dies nicht dann nur für 2D games da? Da bei 3D games Z benutzen muss..
  • Also...
    für für die Drehung in 2D reichen
    lengthdir_x und lengthdir_y. Die benötigen die Argumente len und dir.
    len gibt die Länge an, also wenn du etwas in einem Abstand von 50 um etwas
    anderes Kreisen lassen möchtest, dann machst du (Hier ist z 0):

    GML-Quellcode

    1. direction += 1//Sonne kreist um Spieler
    2. Sonne.x = player.x + lengthdir_x(50,direction)
    3. Sonne.y = player.y + lengthdir_y(50,direction)


    Im 3D Modus kann man Transformationen an einem Objekt vor nehmen.
    Diese beziehen sich immer auf eine Achse. Dabei muss die Reihenfolge beachtet werden,
    in der die Transformation vorgenommen wird, weil der GM die Transformationen addiert.
    (Ja, so ungefähr... ~_~ )

    Vorsichtig. Hier werden die Transformationsdaten addiert,
    es ist für Leute ohne gute Kenntnis schwer nachzuvollziehen.

    CREATE

    GML-Quellcode

    1. direction_y = 0
    2. direction_x = 0


    DRAW

    GML-Quellcode

    1. direction_y += 1
    2. direction_x += 1
    3. direction += 1
    4. d3d_transform_set_identity() //Neusetztung der Transformation. Sehr wichtig.
    5. d3d_transform_add_translation(0,0,0)//Den Abstand mache ich meist auf der x-Achse, weil ich mir dann alles besser vorstellen kann.
    6. d3d_transform_add_rotation_x(direction_x)
    7. d3d_transform_add_rotation_y(direction_y)
    8. d3d_transform_add_rotation_z(direction)
    9. d3d_transform_add_translation(player.x,player.y,player.z)
    10. d3d_draw_ellipsoid(...) // Der Mittelpunkt des Körpers muss auf 0,0,0 liegen, damit alles klappt.
    11. d3d_transform_set_identity()
    Alles anzeigen


    Die einzelnen d3d_transform_add_rotation-Befehle bewirken, dass die Sonne sich
    um die angegebene Gradzahl um die angegebene Achse gedreht wird.
    Der Befehl d3d_transform_add_translation verschiebt die Transformation.

    Ich habe das nicht ausprobiert, da ich hier den GM nicht drauf habe, müsste aber
    alles genauso klappen, wie ich meine, dass es sollte. (Schachtelsatz^^)

    Das ist nur ein Beispiel. Experimentier mal etwas rum. :)

    EDIT: Verbesserungen

    EDIT2: Noch mehr Verbesserungen

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

  • Shapow schrieb:

    Also...
    für für die Drehung in 2D reichen
    lengthdir_x und lengthdir_y. Die benötigen die Argumente len und dir.
    len gibt die Länge an, also wenn du etwas in einem Abstand von 50 um etwas
    anderes Kreisen lassen möchtest, dann machst du (Hier ist z 0):

    GML-Quellcode

    1. direction += 1//Sonne kreist um Spieler
    2. Sonne.x = player.x + lengthdir_x(50,direction)
    3. Sonne.y = player.y + lengthdir_y(50,direction)


    Im 3D Modus kann man Transformationen an einem Objekt vor nehmen.
    Diese beziehen sich immer auf eine Achse. Dabei muss die Reihenfolge beachtet werden,
    in der die Transformation vorgenommen wird, weil der GM die Transformationen addiert.
    (Ja, so ungefähr... ~_~ )

    Vorsichtig. Hier werden die Transformationsdaten addiert,
    es ist für Leute ohne gute Kenntnis schwer nachzuvollziehen.

    CREATE

    GML-Quellcode

    1. direction_y = 0
    2. direction_x = 0


    DRAW

    GML-Quellcode

    1. direction_y += 1
    2. direction_x += 1
    3. direction += 1
    4. d3d_transform_set_identity() //Neusetztung der Transformation. Sehr wichtig.
    5. d3d_transform_add_translation(0,0,0)//Den Abstand mache ich meist auf der x-Achse, weil ich mir dann alles besser vorstellen kann.
    6. d3d_transform_add_rotation_x(direction_x)
    7. d3d_transform_add_rotation_y(direction_y)
    8. d3d_transform_add_rotation_z(direction)
    9. d3d_transform_add_translation(player.x,player.y,player.z)
    10. d3d_draw_ellipsoid(...) // Der Mittelpunkt des Körpers muss auf 0,0,0 liegen, damit alles klappt.
    11. d3d_transform_set_identity()
    Alles anzeigen


    Die einzelnen d3d_transform_add_rotation-Befehle bewirken, dass die Sonne sich
    um die angegebene Gradzahl um die angegebene Achse gedreht wird.
    Der Befehl d3d_transform_add_translation verschiebt die Transformation.

    Ich habe das nicht ausprobiert, da ich hier den GM nicht drauf habe, müsste aber
    alles genauso klappen, wie ich meine, dass es sollte. (Schachtelsatz^^)

    Das ist nur ein Beispiel. Experimentier mal etwas rum. :)

    EDIT: Verbesserungen

    EDIT2: Noch mehr Verbesserungen
    Danke vielmals!

    Ich hab da noch eine Frage...

    Undzwar hab ich da ein 2 Objecte, einer Speichert Daten und iner nutzt diese Daten dann.
    Wenn ich jetzt beide Objecte erstelle, dies geht mit einer Funktion des Players, dann speichert der die Koordinaten von Object 2.

    Sobal ich jetzt auf Object 1 Klicke bringt der mich zu Object 2.
    Aber da ich ja jetzt mehrere solcher Teleportations zweigungen habe, brauche ich mehr als nur eine Variable um die Daten zu speichern.
    Also.. gibt es eine Funktion eine neue Variable zu erstellen mit namen random um diese dann auch Object 2 zuzuweise?

    Hoffe ihr habt verstanden was ich meine.
    Danke
  • Das kannst du doch auch mit einem Array lösen,
    wenn ich dich richtig verstanden habe.
    Du kannst ja machen, das immer zwei Punkte im Array die Koordinaten angeben.

    GML-Quellcode

    1. Location[0] = Objekt2.x
    2. Location[1] = Objekt2.y
    3. Location[2] = Objekt3.x
    4. Location[3] = Objekt3.y
    5. //usw.