d3d transformation Problem mit mehreren rotation

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

  • d3d transformation Problem mit mehreren rotation

    Hallo, in meinem 3d Projekt habe ich ein Skelett. Rumpf mit Kopf ist ein Model und die Beine sin ein Model, dass ich zweimal drawen lasse (2 Beine). Nun möchte ich alle Modelle in die Richtung der direction drehen, das geht. Aber die Beine möchte ich dazu noch drehen lassen um eine Laufanimation zu prgrammieren doch damit habe ich Probleme. Mein Code sieht vie folgt aus:

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_scaling(.5,.5,.5);
    3. d3d_transform_add_rotation_z(direction); // die Modelle werden in Laufrichtung des Skeletts gedreht
    4. d3d_transform_add_translation(x,y,0); // Koordinaten
    5. d3d_model_draw(model,0,0,0,tex); //Rumpf und Kopf
    6. d3d_transform_add_rotation_axis(x,y,8,right_angle); // das geht nicht, die Beine drehen sich je nach Blickwinkel sonst wo hin
    7. d3d_model_draw(model2,-4,0,0,tex2); //rechtes Bein
    8. d3d_model_draw(model2, 4,0,0,tex2); //linkes Bein
    9. d3d_transform_set_identity();
    Alles anzeigen



    Wenn ich z.b. d3d_transfomr_add_rotation_y nehme drehen sich die Beine nicht um x und y sondern um x-4 und das andere um x+4, versteht ihr was ich meine? Wie mache ich das jetzt?
  • [Ironie] Danke für so viel Hilfe! [/Ironie] Ich bin jetzt schon etwas weiter gekommen. Das Problem lag bei dem Befehl d3d_transform_set_identity(). Mein Code sieht jetzt so aus:

    //Rumpf und Kopf

    GML-Quellcode

    1. d3d_transform_set_identity();
    2. d3d_transform_add_scaling(.5,.5,.5);
    3. d3d_transform_add_rotation_z(direction);
    4. d3d_transform_add_translation(x,y,0);
    5. d3d_model_draw(model,0,0,0,tex);
    6. d3d_transform_set_identity();
    7. //Bein links
    8. d3d_transform_set_identity();
    9. d3d_transform_add_scaling(.5,.5,.5);
    10. d3d_transform_add_rotation_z(direction);
    11. d3d_transform_add_rotation_x(left_angle);
    12. d3d_transform_add_translation(x-2,y,0);
    13. d3d_model_draw(model2,0,0,0,tex2);
    14. d3d_transform_set_identity();
    15. // Bein rechts...
    Alles anzeigen



    Das Problem ist jetzt nur noch, dass die X-Achse am Boden ist und nicht da wo das Bein am Becken anfängt: Das Bild zeigt was ich meine:



    Jetzt muss ich ja eigentlich nur noch das Bein auf der X-Achse je nach Winkel so verschieben, dass das Bein immer am Körper hängt. Doch wie berechne ich das??? Ich war schon immer sehr schlecht in Mathe. Aber ich glaube ich brauche dazu die Funktionen cos, sin und degtorad. Kann das sein? Wie muss ich das brechnen, bin leider zu blöd für sowas? Schon mal danke.
  • [Ironie] Danke für so viel Hilfe! [/Ironie]

    Kurz vor Silvester in einem recht kleinem Forum sofort Hilfe (insbesondere bei einem komplexeren Thema) zu erwarten...
    Denk daran: Man hilft hier im Forum gerne mal bei problemen, sofern man die Zeit und das nötige Wissen dazu hat. Man sollte aber nie hilfe fordern und später auch noch enttäuscht (oder gar sauer sein... gab es auch schon hier im Forum...) wenn keine Hilfe geleistet wird. Insbesondere in so einer kurzen Zeitspanne bei einem solch komplexeren Thema (was nur fortgeschrittenere Leute beantworten können) zu solch einer besonderen Zeit.

    Anyway, back to topic.
    Die Reihenfolge wie du die Beine verschiebst/rotierst ist wichtig. Ich bin mir nicht wirklich sicher wie dein Modell gebaut wurde (wo der Urpsrungspunkt xyz=0/0/0 sich am Bein befindet)
    So in etwa könnte eine Lösung ausschauen:

    GML-Quellcode

    1. //Bein links
    2. //damit das funktioniert, muss der Ursprungspunkt des beines am oberen ende positioniert sein!
    3. //ausserdem wird davon ausgegangen ,dass das Modell im Urpsrungszustand in Richtung der Positiven x-achse rotiert ist.
    4. d3d_transform_set_identity();
    5. d3d_transform_add_scaling(.5,.5,.5);
    6. d3d_transform_add_rotation_x(left_angle);//rotiere das bein auf der x-achse (bewegung nach vorne und hinten wird simuliert)
    7. d3d_transform_add_translation(0,-2,6);//verschiebe das Bein um -2 auf der y achse und um 6 "pixel" in die höhe (z-wert muss angepasst werden, je nachdem wie groß das Bein ist.)
    8. d3d_transform_add_rotation_z(direction);//rotiere das bein dann in richtung des Spielers (das bein wurde nach aussen verschoben und wird um den neuen koordinatenpunkt rotiert.)
    9. d3d_transform_add_translation(x,y,0);//das bein wird nun an die position des spielers verschoben
    10. d3d_model_draw(model2,0,0,0,tex2);
    11. d3d_transform_set_identity();
    Alles anzeigen


    Bin mir nicht zu 100% sicher ob das so richtig ist. Arbeite des öfteren auch ausserhalb des GMs mit solchen funktionen, welche hier und da unterschiedlich implementiert wurden.

    /Edit:
    Ich würde dir auch Moolts 3D Tutorial für Transformation empfehlen. Dort wird das auch mit der Rotation erklärt.

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

  • Ja du hast natürlich Recht, ich kann an Sylvester nicht erwarten bei so einem schwierigeren Thema sofort Hilfe zu bekommen. Leuchtet mir jetzt auch ein :)

    Danke für deine Hilfe. Werde deinen Code ausprobieren. Bin gespannt ob's geht.
  • Deine Lösung hat bei mir leider nicht funktioniert aber das macht nix, ich hab jetzt eine andere Lösung. Ich hab einfach den Ursprungspunkt des Bein-Models verändert. In Anim8tor stand das Bein auf dem Boden. Ich hab es einfach unter den Boden verschoben und gespeichert. Jetzt befindet sich Achse, um die das Bein rotiert wird, eben da wo das Bein am Körper anfängt. Supiiiiii :)