Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

jjwayne

Frischling

  • »jjwayne« ist der Autor dieses Themas

Beiträge: 5

Beruf: Student

  • Private Nachricht senden

1

27.08.2012, 13:38

[DirectX9] Rotation um 'fixe' Achsen

Hi Leute

Wie der Titel bereits sagt, möchte ich ein Objekt in 90° Schritten um fixe Achsen (X,Y,Z) rotieren.
Wenn ich folgenden Code verwende,

C-/C++-Quelltext

1
2
3
4
m_rotationX += x;
m_rotationY += y;
m_rotationZ += z;
D3DXMatrixRotationYawPitchRoll( &m_rotate, m_rotationY, m_rotationX, m_rotationZ );

drehen sich die Achsen mit dem Objekt mit. D.h. dass die Y rotation abhängig der X rotation ist.
Dies ist mir soweit auch klar, da die rotationsmatrizen der Reihe nach multipliziert werden.
Was ich aber möchte ist, dass sich das Objekt zb. bei einer 90° rechtsdrehung immer auch nach "rechts" dreht, auch wenn das Objekt zb. auf dem Kopf steht.
Ich muss viellecht noch erwähnen dass ich eine feste Kamera habe, die von vorne auf das Objekt gerichtet ist. Die Rotation soll also immer von der Kamera aus gesehen nach "rechts" sein.
Die X,Y,Z Achsen müssten also fix sein und sich nicht mit dem Objekt mitdrehen.

Hat jemand eine Idee wie ich das lösen kann?

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

2

27.08.2012, 14:03

Naja, für mich sieht das eher so aus, als wäre das dem Code zuzuschreiben, denn du übergibst die Rotationen aller drei Achsen ja jedes Mal neu. Oder setzt du die m_rotation Variablen wieder auf 0 zurück? Ich denke, das += bricht dir hier das Genick.
Wenn du eine Rotation um die Y-Achse willst, versuch's doch z.B. mal mit D3DXMatrixRotationYawPitchRoll( &m_rotate, m_rotationY, 0, 0 );

Als zweites kannst du natürlich auch anders arbeiten, indem du statt die World-Matrix des Objektes mit der neuen Matrix zu multiplizieren, einfach die neue Matrix direkt zuweist. In dem Fall würde deine Matrix immer das gewünschte Endstadium sein und nicht die Veränderung. In dem Fall kannst du wieder mit += arbeiten.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

27.08.2012, 14:04

Stichwort Quaternion. Das ist was du suchst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

jjwayne

Frischling

  • »jjwayne« ist der Autor dieses Themas

Beiträge: 5

Beruf: Student

  • Private Nachricht senden

4

27.08.2012, 14:15

Naja, für mich sieht das eher so aus, als wäre das dem Code zuzuschreiben, denn du übergibst die Rotationen aller drei Achsen ja jedes Mal neu. Oder setzt du die m_rotation Variablen wieder auf 0 zurück? Ich denke, das += bricht dir hier das Genick.
Wenn du eine Rotation um die Y-Achse willst, versuch's doch z.B. mal mit D3DXMatrixRotationYawPitchRoll( &m_rotate, m_rotationY, 0, 0 );
Dass += habe ich, um immer 90° zur bestehenden Rotation hinzuzufügen. Also 1x rotieren = 90°, 2x rotieren = 180° usw.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

27.08.2012, 14:38

Ich denk, die Lösung für dein Problem ist, nicht D3DXMatrixRotationYawPitchRoll() zu verwenden und die Winkel zu addieren, sondern eben für jede Rotation eine eigene Matrix zu bauen und dann auf der richtigen Seite auf die Gesamtmatrix draufzumultiplizieren.

jjwayne

Frischling

  • »jjwayne« ist der Autor dieses Themas

Beiträge: 5

Beruf: Student

  • Private Nachricht senden

6

27.08.2012, 14:55

Ich denk, die Lösung für dein Problem ist, nicht D3DXMatrixRotationYawPitchRoll() zu verwenden und die Winkel zu addieren, sondern eben für jede Rotation eine eigene Matrix zu bauen und dann auf der richtigen Seite auf die Gesamtmatrix draufzumultiplizieren.

Wenn ich für jede Rotation eine neue Rotationsmatrize erstelle und diese draufmultipliziere, wird das an meinem Problem nichts ändern, da die Rotationen immer noch nacheinander gemacht werden.
Hat mir jmd. eine kleine Erklärung/Beispielcode wie ich Quaternionen implementiere?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.08.2012, 15:05

Wenn ich für jede Rotation eine neue Rotationsmatrize erstelle und diese draufmultipliziere, wird das an meinem Problem nichts ändern, da die Rotationen immer noch nacheinander gemacht werden.

Doch, da sie in der richtigen Reihenfolge gemacht werden...

jjwayne

Frischling

  • »jjwayne« ist der Autor dieses Themas

Beiträge: 5

Beruf: Student

  • Private Nachricht senden

8

27.08.2012, 15:32

Wenn ich für jede Rotation eine neue Rotationsmatrize erstelle und diese draufmultipliziere, wird das an meinem Problem nichts ändern, da die Rotationen immer noch nacheinander gemacht werden.

Doch, da sie in der richtigen Reihenfolge gemacht werden...

evtl. habe ich etwas falsches im Kopf. :rolleyes:
Aber meiner Meinung nach macht es keinen Unterscheid, wenn ich zb. die rotation "2x rechts, 1x hoch" mit D3DXMatrixRotationYawPitchRoll(&m_rotate, '180°', 0, '90°') löse oder mit
m_rotate = m_rotateRechts * m_rotateRechts * m_rotateHoch.
Die Achse um die das Objekt nach oben gedreht werden soll, wird nach 2x rechts drehen (180°) verkehrt sein.
D.h. von der fixen Kamera aus gesehen (vorne), dreht sich das Objekt nach unten.
Ich hoffe ihr wisst was ich meine. :wacko:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.08.2012, 15:34

Es macht aber einen riesen Unterschied, ob du einmal nach rechts, dann nach oben und dann wieder nach rechts (das was du, so wie ich dich verstanden hab, haben willst) oder zweimal nach rechts und dann nach oben rotierst (das was du mit D3DXMatrixRotationYawPitchRoll() effektiv machst)...

jjwayne

Frischling

  • »jjwayne« ist der Autor dieses Themas

Beiträge: 5

Beruf: Student

  • Private Nachricht senden

10

27.08.2012, 16:05

Es macht aber einen riesen Unterschied, ob du einmal nach rechts, dann nach oben und dann wieder nach rechts (das was du, so wie ich dich verstanden hab, haben willst) oder zweimal nach rechts und dann nach oben rotierst (das was du mit D3DXMatrixRotationYawPitchRoll() effektiv machst)...

Hach natürlich hast du recht, vielen Dank. :rolleyes:
Problem ist folgendermassen gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
D3DXMATRIX m_rotateX, m_rotateY, m_rotateZ;
D3DXMatrixRotationX(&m_rotateX, x);
D3DXMatrixRotationY(&m_rotateY, y);
D3DXMatrixRotationZ(&m_rotateZ, z);
m_rotate *= m_rotateX;
m_rotate *= m_rotateY;
m_rotate *= m_rotateZ;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »jjwayne« (27.08.2012, 16:42)


Werbeanzeige