ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4395353
Jetzt (Chat):
27 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Problem mit aiMatrix4x4
Normal
AutorThema
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
Problem mit aiMatrix4x4Nach oben.
Hallo die Herren und frohes neues Jahr !

Ich benutze Assimp für mein Ballerspiel, und bin noch dabei, den Code zum Rendern der Assimp-Daten für DirectX vom Assimp-Viewer in mein Spiel zu übertragen. Ich häng jetzt gerade bei den Matrizen, und zwar krieg ich andere Ergebnisse, je nachdem ob ich die aiMatrix4x4 benutze, oder D3DXMATRIX. Ich bin nicht der hellste in Sachen 3D Mathe, aber ich hab schon soviel rausbekommen, dass ich die aiMatrix wohl invertieren muss (ich nehme an, Spaltenvektor vs. Zeilenvektor ?). Also ausführlich sieht das dann so aus:

Code:
D3DXMATRIX dxmatrix;
    
    dxmatrix._11 = matAiPlayerWorld.a1;
    dxmatrix._12 = matAiPlayerWorld.b1;
    dxmatrix._13 = matAiPlayerWorld.c1;
    dxmatrix._14 = matAiPlayerWorld.d1;

    dxmatrix._21 = matAiPlayerWorld.a2;
    dxmatrix._22 = matAiPlayerWorld.b2;
    dxmatrix._23 = matAiPlayerWorld.c2;
    dxmatrix._24 = matAiPlayerWorld.d2;

    dxmatrix._31 = matAiPlayerWorld.a3;
    dxmatrix._32 = matAiPlayerWorld.b3;
    dxmatrix._33 = matAiPlayerWorld.c3;
    dxmatrix._34 = matAiPlayerWorld.d3;

    dxmatrix._41 = matAiPlayerWorld.a4;
    dxmatrix._42 = matAiPlayerWorld.b4;
    dxmatrix._43 = matAiPlayerWorld.c4;
    dxmatrix._44 = matAiPlayerWorld.d4;


Jetzt hab ich das Problem, dass mein Modell seltsam in der Gegend verschoben wird, sobald ich anfange, die Rotationsmatrizen aufeinander zu multiplizieren..! :S Unter DirectX multipliziere ich die so übereinander:
matRotX * matRotY * matRotZ * matTrans;
(erst rotieren, dann verschieben, laut Lehrbuch ) . Wenn ich das in der selben Reihenfolge mit den aiMatrizen mache, krieg ich komische Verdrehungen / Verschiebungen. Die aiMatrizen hab ich vorher so initialisiert:
Code:
aiMatrix4x4::RotationX(PNX_ToRadian(m_Player->m_RotX + m_Player->CALIBRATION_ANGLE_PLAYER_X), matPlayerRotX);
    aiMatrix4x4::RotationY(PNX_ToRadian(m_Player->m_RotY + m_Player->CALIBRATION_ANGLE_PLAYER_Y), matPlayerRotY);
    aiMatrix4x4::RotationZ(PNX_ToRadian(m_Player->m_RotZ + m_Player->CALIBRATION_ANGLE_PLAYER_Z), matPlayerRotZ);
    aiMatrix4x4::Translation(playerPos, matPlayerTranslate);


Wenn ich als world-Matrix beim Rendern nur die aiMatrix für die Translation benutze, wird das Modell immerhin korrekt positioniert. Aber sobald ich die multipliziere, läuft was falsch..! :/

Vielen Dank schonmal für eure Zeit !
11.01.2009, 15:52:43 Uhr
klickverbot Offline
ZFX'ler


Registriert seit:
24.08.2008

Österreich
Re: Problem mit aiMatrix4x4Nach oben.
Mach dich mal über das Transponieren einer Matrix schlau (das machst du nämlich hier), im besonderen wie sich die Transposition im Bezug auf die Multiplikation verhält. Das sollte deine Fragen beantworten.

Letzendlich läuft es darauf hinaus, dass du den Zeilenvektor von DirectX von der anderen Seite an die Matrix multiplizierst, also auch die Reihenfolge der Teiltransformationen umkehren musst (DirectX arbeitet mit Zeilenvektoren, OpenGL mit Spaltenvektoren).

Außerdem verwendet DirectX ein linkshändiges, OpenGL ein rechtshändiges Koordinatensystem, je nach Anwendung der Matrizen kann es also sein, dass die Rotation in die falsche Richtung ausgeführt wird.

1 Mal gendert, zuletzt am 11.01.2009, 16:02:27 Uhr von klickverbot.
11.01.2009, 16:00:38 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Problem mit aiMatrix4x4Nach oben.
Man kann sich das Transponieren auch sparen und die Matrix im Shader column_major statt row_major deklarieren.

Gruß, Ky
11.01.2009, 16:21:26 Uhr
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
Re: Problem mit aiMatrix4x4Nach oben.
vielen Dank, Klickverbot !

Ich hab die einzelnen Matrizen jetzt jeweils transponiert, bevor ich sie aufeinander multipliziere, damit ich die Reihenfolge beibehalten kann. Und am Ende übertrag ich die "fertige" aiMatrix dann untransponiert in die zu rendernde D3DXMATRIX. Sieht schon viel besser aus, aber die Rotations-Achsen sind tatsächlich falschrum. Ich versteh die Theorie dahinter nicht...was ist denn jetzt die sauberste Art, das umzurechnen ? Einfach jeweils das Vorzeichen des Winkels umdrehen, wenn ich die Rotations-Matrix erstelle ? Oder hat das irgendwelche Nebenwirkungen ?

Edit: klappt alles, ich denke mal, keine Nebenwirkungen vielen Dank euch beiden für die Hilfe !!
happy: ponx

1 Mal gendert, zuletzt am 11.01.2009, 16:52:03 Uhr von ponx.
11.01.2009, 16:28:26 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Problem mit aiMatrix4x4Nach oben.
Hintergrund: Wir benutzen die OpenGL-Declaration für Matrizen, sprich colum-majored. mehr dazu findest du hier:
http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html

Gruß Kimmi
12.01.2009, 11:47:45 Uhr
Kurzer Weblog
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
Re: Problem mit aiMatrix4x4Nach oben.
ah, danke Kimmi! Bei euch in aiMatrix4x4.h steht im Kommentar noch "represents a row-major 4x4 matrix". ..war gerade verwirrt, aber das ist dann wohl ne Altlast ?
cheers,
ponx
17.01.2009, 19:40:41 Uhr
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: Problem mit aiMatrix4x4Nach oben.
Öhm... ja, sorry, der Kommentar stammt von mir und noch aus den Zeiten, als ich die Namen der beiden immer verwechselt hab. Ich werde es korrigieren.
17.01.2009, 22:00:21 Uhr
Dreamworlds Development
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel