3d Model Rotation

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

  • 3d Model Rotation

    Ich hätte da mal wieder ein 3d Problem :ops:
    Und zwar möchte ich ein geladenes Model um die eigene Z Achse rotieren.
    Ich habe es schon so versucht:

    d3d_transform_set_identity();
    d3d_transform_add_rotation_axis(0,0,40,rotate);
    d3d_transform_add_translation(x+0,y+0,0);
    MODEL CODE
    d3d_transform_set_identity();

    (Variable rotate wird jeden step erhöht)

    Nur dreht sich das model dann nicht um die eigene Achse sondern in großem Bogen um das eigentliche Object herum..
    Liegt das vielleicht am Origin von dem Model?

    Danke im Vorraus!
    Bilder
    • rorate problem.jpg

      9,22 kB, 322×301, 512 mal angesehen

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

  • Du setzt die Translation auf (x|y|0). Das heißt, dass alle 3D-Objekte, die du ab jetzt zeichnest von diesem Punkt aus und nicht von (0|0|0) "gemessen" werden.

    Das heißt also, wenn du die Translation als (x|y|0) angibst, und eine Ellipse mit einem Durchmesser von 100 Pixeln dort zeichnen willst, sieht das so aus:

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_rotation_axis(0,0,40,rotate);
    3. d3d_transform_add_translation(x+0,y+0,0);
    4. d3d_draw_ellipsoid(-50,-50,-50,50,50,50,texid,1,1,24)
    5. d3d_transform_set_identity();


    Verstanden? ;)

    EDIT:

    GML-Quellcode

    1. //Wieso eigentlich
    2. d3d_transform_add_translation(x+0,y+0,0);
    3. //?
    4. d3d_transform_add_translation(x,y,0);
    5. //ist kürzer und sagt genau das geliche aus...
    kostenlose Android-Spiele:
    hexavirScribble Triple

    Mr. Peperonico auf Facebook

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

  • So ich habe jetzt noch ein bisschen rumgefummelt aber es ist immer noch nicht perfekt

    Ich habe den Code jetzt :

    draw_set_blend_mode(true)
    draw_set_alpha(1);
    draw_set_color(c_white);
    d3d_transform_set_identity();
    d3d_transform_add_rotation_axis(x,y,1,rotate);
    d3d_transform_add_translation(0,0,0);
    d3d_model_draw(global.model_1,x,y,2,tex2);
    d3d_transform_set_identity();
    draw_set_color(c_white);
    draw_set_blend_mode(false)

    Nun sieht das so aus (Bild) ich möchte aber nur eine Z Rotation.

    (Bild ist animiert, zum anschauen klicken)
    Bilder
    • 11.gif

      435,69 kB, 640×480, 469 mal angesehen

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

  • versuch es mal so:

    GML-Quellcode

    1. d3d_transform_add_translation(-x,-y,0);
    2. d3d_transform_add_rotation_z(rotate);
    3. d3d_transform_add_translation(x,y,0);
    4. d3d_model_block(Model1,-10,-10,-10,10,10,10,1,1);
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • WoW, das läuft ja schon viel besser!
    Ich war die ganze Zeit der Annahme das es etwas mit dem Origin zu tun hat, aber jetz dreht es sich HAARGENAU um die Z Achse!
    Damit wäre wohl einer meiner letzten extremen Probleme gelöst!
    Danke!
    -----------------------------------------------------------------

    Ach schon wieder ein rotier Problem:
    Ich möchte einen "floor" um 180° auf der x, oder y Achse drehen (weis nicht genau xD)

    Habe diesen Code:
    d3d_transform_add_translation(-x,-y,0);
    d3d_transform_add_rotation_y(180);
    d3d_transform_add_translation(x,y,0);
    d3d_draw_floor(x-16,y-16,32,x+16,y+16,32,tex_c,1,1);
    d3d_transform_set_identity();

    (Das ist noch der von WIN )

    Nur jetz kommt das selbe Problem wie vorher..

    (Frontale Ansicht)
    Bilder
    • rotier.jpg

      1,73 kB, 125×76, 448 mal angesehen

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

  • Bitte beachten, dass man Matrizen-Transformationen rückwärts ausführen muss.
    Die normale Reihenfolge ist ja: Rotieren und dann Translatieren.
    Aber durch die Eigenschaft der Matrizen-Multiplikation und der anschließenden Rechtsmultiplikation mit dem Vertex, wird das ganzen rückwärts ausgeführt.
    Weiß jetz nich ob D3D es durch nen Stack andersrum löst.
    Aber so sollte es gehen:

    Identity
    Rotation
    Translation
    Objekt
    Identity

  • SO benutze jetz diesen Code:

    d3d_transform_set_identity();
    d3d_transform_add_rotation_axis(0,0,40,180);
    d3d_transform_add_translation(x,y,0);
    d3d_draw_floor(-16,-16,32,+16,+16,32,tex_c,1,1);
    d3d_transform_set_identity();

    Es sieht gut aus, ich teste aber noch obs wirklich klappt.
  • Ein Tip:

    du musst nicht

    GML-Quellcode

    1. d3d_transform_add_rotation_axis(0,0,40,180);

    machen. (0,0,40) gibt nur den RotationsVEKTOR an. Da reicht auch (0,0,1).
    also

    GML-Quellcode

    1. d3d_transform_add_rotation_axis(0,0,1,180);

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

  • Mir fällt gerade auf das ich mit dem Code oben eine perfekte Z Rotation habe..
    Aber ich wollte ja eine x oder y Rotation haben.

    Dann muss man im Prinzip ja das machen aber der will dann immer noch nicht vernunftig rotieren..
    d3d_transform_add_rotation_axis(1,0,0,180);
  • Original von WIN
    [...]

    GML-Quellcode

    1. d3d_transform_add_translation(-x,-y,0);
    2. d3d_transform_add_rotation_z(rotate);
    3. d3d_transform_add_translation(x,y,0);
    4. d3d_model_block(Model1,-10,-10,-10,10,10,10,1,1);

    Meinst du diesen Code mit der perfekten Rotation? Wenn ja, dann musst du nur eine Kleinigkeit ändern:

    GML-Quellcode

    1. d3d_transform_add_translation(-x,-y,0);
    2. d3d_transform_add_rotation_x(rotate); //Hier das "z" einfach in ein x bzw y ändern
    3. d3d_transform_add_translation(x,y,0);
    4. d3d_model_block(Model1,-10,-10,-10,10,10,10,1,1);
    kostenlose Android-Spiele:
    hexavirScribble Triple

    Mr. Peperonico auf Facebook
  • Nein, was ich jetz möchte ist einfach nur einen "floor" um die x Achse zu rotieren..

    d3d_transform_set_identity();
    d3d_transform_add_rotation_axis(0,0,1,180);
    d3d_transform_add_translation(x,y,0);
    d3d_draw_floor(-16,-16,32,+16,+16,32,tex_c,1,1);
    d3d_transform_set_identity();

    Damit hatte ich schon eine z umdrehung aber wenn ich es zB durch
    d3d_transform_add_rotation_axis(0,1,0,180);
    ersetze gehts nicht mehr...
  • (0,1,0) is auch ne Rotation um die y-Achse.
    Um x-Achse herum rotieren wäre:

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_rotation_axis(0,0,1,180);
    3. d3d_transform_add_translation(x,y,0);
    4. d3d_draw_floor(-16,-16,32,+16,+16,32,tex_c,1,1);
    5. d3d_transform_set_identity();

  • d3d_transform_set_identity();
    d3d_transform_add_rotation_axis(0,0,1//das ist z,180);
    d3d_transform_add_translation(x,y,0);
    d3d_draw_floor(-16,-16,32,+16,+16,32,tex_c,1,1);
    d3d_transform_set_identity();

    Nein das ist eine Z Rotation..
    Ich möchte aber doch eine x oder y..
    Deswegen dachte ich mir
    d3d_transform_add_rotation_axis(0,1,0,180);
    mach ich doch bei x oder y ne 1 hin aber das rotiert dann sehr merkwürdig..
  • Dieser Code sollte eigentlich funktionieren:

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_rotation_x(180);
    3. d3d_transform_add_translation(x,y,z);
    4. /* Model */
    5. d3d_transform_set_identity();

    Falls es nicht geht erkläre wenigstens was passiert...

    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Also ich habe jetz einfach anstatt "model" mein floor darein getan:

    d3d_transform_set_identity();
    d3d_transform_add_rotation_x(180);
    d3d_transform_add_translation(x,y,z);
    d3d_draw_floor(-16,-16,32,+16,+16,32,tex_c,1,1);
    d3d_transform_set_identity();

    Nur dreht es sich nicht um die eigene x achse sondern um eine komische andere, siehe mein ersten post...