|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.06.2004, 19:25 Titel: Animierte 3D Modelle |
|
|
Ich bastel mir gerade einen Modelleditor für meine 3D Modelle. Natürlich sollen sie auch ein bischen animiert sein, sonst siehts ja Kacke aus. Da ich schon ein bischen darüber gelesen bzw. aufgeschnappt hab, hab ich schon eine relativ genaue Vorstellung wie das ganze Animationssystem aussehen soll.
Man baut die verschiedenen Teile einer Figur (Torso, Beine, Armee, Kopf) als einzelne Modelle. Dann definiert man einen Mdoellmittewlpunkt (in disem Falle wahrscheinlich den Torso), und speichert für jedes andere Teil eine Matrix, die genau die Position, Größe und Drehung usw. der einzelnen Gliedmaße angibt.
Will man jetzt eine Animation machen, ändert man einfach diese Matrizen zum endstadium der Animation und speichert die Zeit, die für die A. benötigt werden soll.
Bei abpsielen wird dann unter berücksichtigung der vergangenen Zeit Jedes Körperteil mit einer MAtrix gerendert, die das Resultat einer Interpolation der beiden anderen Matrizen ist.
Wenn man hinterher bestimmte Körperteile von anderen abhängig macht, also z. B. die Hand vom Arm, kann man sehr einfach auch komplexere Animationen erstellen, ohne da Modell ändern zu müssen.
So bräuchte man nicht die Vertezes zweimal zu speicher und dann zwischen ihnen interpolieren, sondern nur die 2 Matrizen interpolieren.
Meine Frage ist ´jetzt, ob das überhaupt möglich ist matrizen zu interpoliren, und was ihr von meiner Idee haltet. (Ist ja schon fast ein bsichen wie wenn man mit bones arbeiten würde) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Dirk Mini JLI'ler
Anmeldedatum: 22.09.2003 Beiträge: 11
Medaillen: Keine
|
Verfasst am: 01.06.2004, 20:07 Titel: |
|
|
Zur Interpolation von Matrizen:
Du kann Matrizen natürlich linear interpolieren, nur wird das Ergebnis nicht brauchbar sein. Das liegt daran das Transformationsmatrizen bestimmte Eigenschaften haben, die durch das Interpolieren zerstört werden. Das Zauberwort heisst Matrixdecomposition - ich nehme jetzt mal an, dass Du Deine Matrix RowMajor speichert ( wie DirectX ). Eine einfache Lösung ist folgende:
1. Berechner die Länge der ersten drei Zeilenvektoren und speichere das Ergebnis in einem 3D Vektor.
2. Normaliesiere die ersten drei Zeilen der Matrix
3. Speichere die ersten drei Elemente der letzen Zeile ebenfalls in einem Vektor
4. Transformiere die obere 3x3 Matrix in eine Quaternion
5. Wiederhole 1 - 4 für die andere Matrix
6. Nun interpolierst Du die Vektoren mit den Skalierungswerten und den Positionswerten linear und die Quaternion mit SLERP.
7. Alle Daten wieder in eine Matrix packen
Es gibt noch bessere Matrixdecompositions ( Granny von RAD benutzt was besseres ), das habe ich aber noch nicht ausprobiert. Ich glaube weiter, mich zu erinnern, dass es zwei Funktionen in D3DX gibt die genau das da oben machen - seh ich später mal nach.
Hier noch ein Beispiel:
Du hast eine Matrix
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Skalierungsvektor s aufbauen:
s.x = Lenght( 1, 2, 3, 4 );
s.y = Lenght( 5, 6, 7, 8 );
usw.
Positionsvektor p aufbauen
p = ( 13, 14, 15 );
Normalisieren:
Normalise( 1, 2, 3, 4 );
usw...
3x3 Matrix erstellem mit den normalisierten Werten!!! und diese in eine Quaternion umwandeln
Hoffe das hilft!
-Dirk |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.06.2004, 12:10 Titel: |
|
|
Naja, ich bin nicht gerade Profi in Matrizen. Und leider weiß ich nicht, was Quaternions sind.
Klar als Matrix würd ich entwerder D3DXMATRIX oder eine andere Struktur der gleichen Form nehmen. (float m[4][4])
Das man nicht einfach M1.m11 mit M2.m11 interpolieren kann, ist zwar schade, wäre aber auch zu einfach gewesen...
Aber jetzt Frage ich mich natürlich, wo in deinem Beispiel die 2 Matrix ist. Außerdem bräuchte ich ja nach einen Interpolationsfaktor (ein Wert zwischen 0 und 1 oder so, der angibt, wie stark die jeweilige Matrix in die neue einfließen soll), denn ich bracuhe ja nicht einen Mittelwert, sondern quasi einen fließenden Übergang.
Ich bäcuhte also ne Funktionen der Form
Matrix MatrixInterplation(Matrix1, Matrix2, Interpolationsfaktor);
(ja, ich weiß das es keine richtige Interpolation ist) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Dirk Mini JLI'ler
Anmeldedatum: 22.09.2003 Beiträge: 11
Medaillen: Keine
|
Verfasst am: 02.06.2004, 13:52 Titel: Quaternionen |
|
|
Ok,
Du musst zunächst einmal lernen zwischen den mathematischen Konsrukten ( Vektoren, Matrizen und Quaternionen ) und dem was Du mit Ihnen repräsententieren will zu unterscheiden. Beispiele:
Ein Vektor kann einen Ort in einem KO-System beschreiben oder eine Richtung definieren. Matrizen können ein ganzes KO-System beschreiben, lineare Transformationen ( Translation, Rotation, Skalierung ) definieren oder aber in einem Physiksystem physikalische Eigenschaften eines Körpers speichern. Was Du wie beschreiben möchtest ist Dir überlassen, manche Sachen sind halt weniger sinnvoll als andere.
Bei Deinem Problem geht es um die Repräsentierung der Orientierung. Orientierung stellst Du am besten als Deine Blickrichtung vor. Orientierung können auf verschiedene Art und Weise mathematisch beschreiben werden: Eulerwinkel ( also einfach drei Zahlenwerte ), Matrizen, Quaternionen, Spinore und was weiss ich was noch alles gibt.
Wenn Du eine Orientierung als Matrix speicherst ist diese Matrix immer orthogonal, dh. die Spalten- bzw. Zeilennektoren haben die Länge eins und stehen senkrecht aufeinander. Interpoliertst Du nun linear zwischen zwei solchen Matrizen wie folgt
M' = ( 1 - w ) * A + w * B
ist das Ergebnis eine Matrix deren Vektoren nicht mehr normiert sind und auch nicht mehr senkrecht aufeinander stehen. Du siehst also, dass obwohl man zwischen Matrizen sehr wohl linear interpolieren kann, das hier keinen Sinn macht, da das Ergebnis keine Orientierung mehr beschreibt. Bei Eulerwinkel gibt es ebenfalls Probleme bei der Interpolation sowie ein Problem namens Gimbal Lock ( vielleicht schonmal gehört ). Quaternionen sind hyperkomplexe Zahlen, die alle diese Probleme nicht haben, dafür aber schwierigen sich vorzustellen sind.
Ich hoffe das hilft Dir einigermassen, wenn Du einigermassen gut Englsich sprichst sollten Du über den Kauf folgendes Buches nachdenken:
"Essential Mathematics For Games"
So jetzt zu Deinem zweiten Problem, woher kommt die zweite Matrix und woher kommt die Zahl w zwischen 0 und 1:
Angenommen Du hast eine Aniamtionssequenz von einer Sekunde Länge als Reihe von 30 Bilder gespeichert, dann must Du also jede 1/30 Sekunde ein Bild abspielen. Jetzt hast Du zwei Möglichkeiten. Entweder wartest Du immer bis 1/30 Sekunde abgelaufen ist und renderst dann das neue Bild oder Du interpolierst. Deine erste Matrix ist dann der Frame an dem Du gerade vorbei bist, Deine zweite Matrix ist der Frame der als nächstes kommt und w ist die Stelle zwischen diesen beiden Frames. In Christains neuem Buch wird das alles erklärt.
Schliesslich habe ich mir noch mal die D3DXMatrix API angeshen und die hat eigentlich alles was Du brauchst. Zur Dekomposition kannst Du
HRESULT WINAPI D3DXMatrixDecompose(
D3DXVECTOR3 *pOutScale,
D3DXQUATERNION *pOutRotation,
D3DXVECTOR3 *pOutTranslation,
const D3DXMATRIX *pM
);
nehmen. Zur interpolations nimmst Du dann jeweils entsprechend
D3DXVECTOR3 *D3DXVec3Lerp(
D3DXVECTOR3 *pOut,
CONST D3DXVECTOR3 *pV1,
CONST D3DXVECTOR3 *pV2,
FLOAT s
);
und
D3DXQUATERNION *WINAPI D3DXQuaternionSler(
D3DXQUATERNION *pOut,
CONST D3DXQUATERNION *pQ1,
CONST D3DXQUATERNION *pQ2,
FLOAT t
);
und schliesslich kann Du das wieder mit
D3DXMATRIX *WINAPI D3DXMatrixTransformation(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pScalingCenter,
CONST D3DXQUATERNION *pScalingRotation,
CONST D3DXVECTOR3 *pScaling,
CONST D3DXVECTOR3 *pRotationCenter,
CONST D3DXQUATERNION *pRotation,
CONST D3DXVECTOR3 *pTranslation
);
wieder zusammenbauen. In Deinem Fall gilt:
pScalingCenter = pScalingRotation = pRotationCenter = NULL;
Ich hoffe das hilft!
-Dirk |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.06.2004, 14:03 Titel: |
|
|
Jo, danke schon mal. Ich denke ich werds mir mal näher anschauen, im Moment entwickelt ich ja sowieso noch den 3DModelleditor, wenn der fertig ist, versuchs ichs mal mit den Funktionen hinzukriegen. Oder ich warete auf Christains neues Buch, mal sehen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 11.06.2004, 07:28 Titel: Re: Quaternionen |
|
|
Dirk hat Folgendes geschrieben: |
...
Ich hoffe das hilft Dir einigermassen, wenn Du einigermassen gut Englsich sprichst sollten Du über den Kauf folgendes Buches nachdenken:
"Essential Mathematics For Games"
|
das buch hab ich grad bei meinem usa-urlaub mitgehen lassen...kann ich auch nur wärmstens empfehlen. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|