D3D Rotation und Skalierung

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

  • D3D Rotation und Skalierung

    So ganz im Griff habe ich die 3D Sache wohl doch noch nicht. Witzig ist, dass das 3D auch funktioniert, wenn ich d3d_start(); nicht mache und in meine speziellen Anwendungsfall hat es den Vorteil, dass er weder die Grafiken verkehrt herum spiegelt, noch meinen Hintergrund kaputt haut. Aber das nur nebenbei.

    Mein Problem betrifft die Bewegung eines Objekts. Mit

    GML-Quellcode

    1. d3d_transform_add_rotation_x(wert);
    2. d3d_transform_add_rotation_y(wert);
    3. d3d_transform_add_rotation_z(wert);


    rotiere ich ja die einzelnen Achsen, mit

    GML-Quellcode

    1. d3d_transform_add_scaling(wert, wert, wert);


    Skaliere ich mein 3D Objekt rauf und runter. Nun mein Problem: im Prinzip funktioniert es, aber durch die Anwendung der Befehle (egal welcher) verschiebt sich auch die Position des Objekts auf den Achsen. Wenn ich also rotiere, dann "wandert" das Objekt weg, aber ich möchte es erst einmal in der Bildmitte drehen. Da ich am Code nichts verkehrtes sehe, war mein Gedanke, dass der Mittelpunkt vom Objekt nicht passt. Kann man das in GM irgendwie einstellen? Habt ihr eine andere Vermutung?
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Du musst das object zuerst auf die Null Koordinaten des Raumes setzen, dann drehen, skalieren und dann wieder auf die eigentliche Position setzen. Dann sollte es funktionieren, sonst rotierst du das Object nämlich auf einem Kreis um die Null Koordinate herum.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Meinst du etwa mit

    GML-Quellcode

    1. x = view_xview[0] + room_width / 2;
    2. y = view_yview[0] + room_height / 2;


    So setze ich das Objekt mittig auf die Position, aber bei der Bewegung verschiebt es sich, egal ob ich das in Step oder Draw korrigiere.

    Auch

    GML-Quellcode

    1. d3d_model_draw(torus, view_xview[0] + room_width / 2, view_yview[0] + room_height / 2, z, torus_text);


    hilft nicht wirklich bei der Korrektur. :(
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Fast, du musst aber bei dem code der dein object rotieren lässt, in etwa sowas hier schreiben

    GML-Quellcode

    1. //rotate
    2. d3d_transform_set_identity(); //benutz dieses object zum transformieren
    3. d3d_transform_set_translation(0,0,0); //bewege es in die mitte des raums
    4. d3d_transform_set_rotation_x(xRot); //rotiere
    5. d3d_transform_set_rotation_y(yRot);
    6. d3d_transform_set_rotation_z(zRot);
    7. d3d_transform_set_scaling(xScale,yScale,zScale); //scaliere
    8. d3d_transform_set_translation(x,y,z);//bewege es wieder an die stelle wo es gezeichnet werden soll
    9. d3d_transform_set_identity(); //ende der transformierung
    10. //draw das object
    Alles anzeigen

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Super, vielen Dank! Es ist jetzt perfekt mittig, allerdings bewegt es sich jetzt keinen Pixel mehr. ;(

    So sieht jetzt der ganze Draw aus. Manches davon muss so sein, weil sonst andere 2D Effekte nicht funktionieren:

    GML-Quellcode

    1. d3d_set_lighting(true);
    2. draw_set_color(c_white);
    3. draw_set_alpha(alpha);
    4. d3d_transform_set_identity();
    5. d3d_transform_set_translation(0,0,0);
    6. d3d_transform_set_rotation_x(rot_x);
    7. d3d_transform_set_rotation_y(rot_y);
    8. d3d_transform_set_rotation_z(rot_z);
    9. d3d_transform_set_scaling(scale, scale, scale);
    10. d3d_transform_set_translation(x,y,z);
    11. d3d_transform_set_identity();
    12. d3d_set_hidden(false);
    13. d3d_set_culling(true);
    14. d3d_model_draw(torus, x, y, z, torus_text);
    15. d3d_set_culling(false);
    16. d3d_transform_set_identity();
    17. d3d_set_lighting(false);
    Alles anzeigen
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Aktueller Stand meiner Bemühungen. Wenn ich es so mache:

    GML-Quellcode

    1. d3d_set_lighting(true);
    2. draw_set_color(c_white);
    3. draw_set_alpha(alpha);
    4. d3d_transform_set_identity();
    5. d3d_transform_set_translation(0, 0, 0);
    6. d3d_transform_add_rotation_x(rot_x);
    7. d3d_transform_add_rotation_y(rot_y);
    8. d3d_transform_add_rotation_z(rot_z);
    9. d3d_transform_add_scaling(scale, scale, scale);
    10. d3d_set_culling(true);
    11. d3d_model_draw(torus, 0, 0, 0, torus_text);
    12. d3d_transform_set_identity();
    13. d3d_set_culling(false);
    14. d3d_set_lighting(false);
    Alles anzeigen


    dreht und skaliert sich das Objekt wirklich auf einem Punkt, wie ich es haben will. Allerdings auf den Koordinaten x=0, y=0. Wenn ich das Objekt in die Mitte schieben will, etwa durch Änderung der Koordinaten im Draw oder im Step, passiert entweder nichts oder er rotiert nicht mehr um den eigenen Nullpunkt sondern wie gehabt, um einen Kreis, dessen Radius meiner Koordinate entsprechen.
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Und nun habe ich es!

    GML-Quellcode

    1. d3d_set_lighting(true);
    2. draw_set_color(c_white);
    3. draw_set_alpha(alpha);
    4. d3d_transform_set_identity();
    5. d3d_transform_set_translation(0, 0, 0);
    6. d3d_transform_add_rotation_x(rot_x);
    7. d3d_transform_add_rotation_y(rot_y);
    8. d3d_transform_add_rotation_z(rot_z);
    9. d3d_transform_add_scaling(scale, scale, scale);
    10. d3d_transform_add_translation(view_xview[0] + room_width / 2, view_yview[0] + room_height / 2, z);
    11. d3d_set_culling(true);
    12. d3d_model_draw(torus, 0, 0, z, torus_text);
    13. d3d_transform_set_identity();
    14. d3d_set_culling(false);
    15. d3d_set_lighting(false);
    Alles anzeigen


    Das Problem war, dass ich am Anfang d3d_transform_set_translation benutzen muss und dann d3d_transform_add_translation. Nun bewegt es sich so wie ich will. :thumbsup:
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Kein Problem, kann passieren :)

    Ein Problemchen habe ich aber noch. Wenn sich ein Torus dreht (beim Würfel habe ich das Problem nicht) dann kann ich, wenn der Torus so steht, dass sich vier Flächen überlagern, durch die vordersten Polygone sehen. Dazu zwei Screenshots im Anhang. Bild 1 = alles gut, Bild 2 = schlecht. :whistling:

    Ob komplexe Textur oder nicht, spielt dabei keine Rolle. Culling ist an, wenn ich es ausschalte, wird es noch schlimmer. Auf den Bildern ist der Torus mit vielen Flächen zu sehen, ein Versuch mit weniger Flächen war nicht besser.
    Bilder
    • torus4.jpg

      78,12 kB, 1.920×1.080, 342 mal angesehen
    • torus5.jpg

      58,35 kB, 1.920×1.080, 327 mal angesehen
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • Bevor ich es vergesse, trage ich es noch hier nach. Das Problem mit der Teiltransparenz wurde nicht ganz gelöst, wenn man d3d an schaltete. d3d_start bewirkte zwar, dass die Polygone ordentlich(er) dargestellt wurde, aber durchschauen konnte man dennoch. Das Problem war die Kamera.

    Mein erster Code war folgender:

    GML-Quellcode

    1. d3d_set_projection(100, 100, 10, 200, 100, 10, 0, 0, 1);


    Das ist der Code, den GM in der Hilfe angibt. Allerdings brachte der in meiner Szene nichts. Ob ich das im Draw an hatte, aus hatte oder als Kommentar "Marry hat ein kleines Lamm" hin schrieb, spielte keine Rolle. Zum Verständnis: ich wollte auf den 2D Background schauen, 3D Objekte anzeigen und dabei 2D Effekte und Bilder zeigen. Alles funktionierte, bis auf die durchsichtigen 3D Objekte.

    Die Lösung war der Befehl d3d_set_projection_ext. Man kann das Beispiel aus der Hilfe nehmen, allerdings war dann meine Perspektive total verdreht. Damit das bei einem Raum von 1024*768 funktionierte, musste folgender Code her:

    Kamera-Draw:

    GML-Quellcode

    1. d3d_set_projection_ext(x, y, 664, x, y, -660, 0, -1, 0, 60, view_wview[0] / view_hview[0], 1, 16000);


    Und schon war es perfekt. Auf dem Weg dorthin sah ich noch lustige Perspektiven meiner an sonst fertigen Szene, aber wirklich weiter gebracht hat mich das Zwischenergebnis nicht. :D

    Ich hoffe es hilft jemandem weiter. Im "schlimmsten" Fall mir selbst, wenn ich in einem Jahr vor dem selben Problem stehen werde und die Lösung verschlampt habe. :D :D
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler

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