SharpDX Rotation von World Space um einen anderen World Spac

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
SharinganShuriken
Beiträge: 4
Registriert: 30.01.2018, 15:20

SharpDX Rotation von World Space um einen anderen World Spac

Beitrag von SharinganShuriken » 13.02.2018, 21:50

Hallo Leute,

wie der Titel schon sagst habe ich ein Problem mit Rotations Matrizen.

Ich habe aus einem File die World Space Matrizen von Joints herausgeladen und möchte jetzt diese als Preview Skeleton in meiner Szene zeichnen lassen. Also wenn der rechte Arm sich dreht, soll sich natürlich auch die rechte Hand mit drehen.

Nur irgendwie bin ich zu blöd die richtige Formel dafür aufzustellen :(

Das ist was ich bis jetzt versucht habe und auch in verschiedenen Kombinationen:

Code: Alles auswählen

Matrix jointMatrix = (parentRotationMatrix * joint.Parent.WorldSpace.Matrix) * joint.WorldSpace.Matrix;
Könnt ihr mir weiterhelfen und erkären wo mein Denkfehler liegt?

Grüße

Benutzeravatar
Krishty
Establishment
Beiträge: 6739
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SharpDX Rotation von World Space um einen anderen World

Beitrag von Krishty » 13.02.2018, 22:01

Bei Matrizen ist die logische Reihenfolge umgekehrt der aufgeschriebenen. Wenn du also rotate * translate schreibst, wird erst verschoben, dann rotiert.

In deinem Fall möchtest du, dass erst die Hand ihre Bewegung ausführt. Dann führt die Hand mit dem Arm zusammen dessen Bewegung aus. Und dann werden Arm und Hand an den Ort geschoben, an dem die Figur steht. Und nun alles umdrehen:

  Matrix = Figur * Arm * Hand; (wie auch immer die in deinem Code heißen)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

SharinganShuriken
Beiträge: 4
Registriert: 30.01.2018, 15:20

Re: SharpDX Rotation von World Space um einen anderen World

Beitrag von SharinganShuriken » 13.02.2018, 23:07

Hallo Krishty,

ich glaub ich hab mich etwas unglücklich ausgedrückt.

Erst soll der Arm rotiert werden und dann die Hand. Also wenn ich den Arm nach vorne rotiere, sollen Hand und alle Finger mit nach vorne gehen.

Joint.Parent war in meinem Beispiel der Arm und Joint die Hand gewesen. Nähmlich nur für den Arm habe ich einen Rotationswert, die Hand soll erstmal nichts machen, sondern einfach nur mit dem Arm mit gehen.

Grüße

joggel
Establishment
Beiträge: 1386
Registriert: 06.11.2007, 19:06

Re: SharpDX Rotation von World Space um einen anderen World

Beitrag von joggel » 14.02.2018, 10:32

Ich glaube, ich verstehe dein Problem.
Die Child-zu-Parent-Matritzen sind im Weltkoordinatensystem.
Du benötigst aber zB die Handmatrix relativ zur Armmatrix, oder?
Also eine umwandlung der Handmatrix vom Welt-KO-System, zum KO-System des Armes?

Gruß

Edit:
Deine formel da oben...ich bin auch nicht so der Mathematiker, aber ich glaube deine Multiplikation der einzelnen matrizen ist falsch. Die einzelnen joint-matrizen dürfen nicht im Welt-KO-System sein. Die multiplikation muss mit den Matrizen durchgeführt werden, die die Position/Rotation/etc relativ zum Parent beschreiben...
(Wenn ich falsch liege, gerne berichtigen.)
CEO of Dirty Codez Production®

joeydee
Establishment
Beiträge: 628
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: SharpDX Rotation von World Space um einen anderen World

Beitrag von joeydee » 14.02.2018, 14:22

Wenn ich dein Problem richtig verstehe, brauchst du die Hand-Matrix nicht im World- sondern im Arm-Space ("Wie sieht die Lage der Hand vom Arm aus gesehen aus?"). Multipliziere dazu die geladene Hand- mit der Inversen der geladenen Arm-Matrix (einmalig). Nun kannst du jeweils die Arm-Matrix verändern und die Hand-Matrix dranmultiplizieren, und sie bewegt sich entsprechend mit.
(Ich hoffe ich habe da jetzt nichts verdreht, war aus dem Kopf). Natürlich musst du dasselbe mit dem Arm in Bezug auf den Körper machen usw. Da wirst du dich einmal beim Laden durch die ganze Hierarchie durchhangeln müssen, wie die Körperteile zusammenhängen. Und beim Rendern dann ebenso immer die nächsten Matrizen dranmultiplizieren, am besten über einen LiFo-Stack.

Antworten