2010-06-22 8 views
14

Ich speichere die Position eines Objekts im 3D-Raum in einer 4by4 Transformationsmatrix. jetzt, um das Objekt von der in der Matrix A gespeicherten Position zu der in der Matrix B gespeicherten Position zu bewegen, möchte ich sie interpolieren.3D-Geometrie: Wie interpoliere ich eine Matrix

also tue ich das einfach, indem ich jeden der 16 Werte in der Matrix interpoliere, oder muss ich etwas besonders beachten?

danke!

+1

Wie speichern Sie die "Position" eines Objekts in einer Transformationsmatrix? Ist das eine Kamera? Weitere Informationen erforderlich. – Jacob

Antwort

4

Wenn Sie nur die Matrixwerte interpolieren, erhalten Sie wahrscheinlich nicht das, was Sie wollen, es sei denn, Sie führen nur sehr einfache Transformationen durch (z. B. Translation oder Skalierung).

Ich denke, es gibt Methoden, die eine Matrix in Translation, Rotation, Skalierung usw. zerlegen und dann können Sie neue Matrizen erstellen, die basierend auf diesen Parametern interpolieren.

Sie könnten auch einfach eine Vorher-Nachher-Transformation durchführen und dann die Verts des Objekts lesen. Dies kann auch nicht geben Sie die Ergebnisse, nach denen Sie suchen.

5

Ich gehe davon aus, was Sie fragen wird, haben Sie ein Objekt bekam x, haben Sie eine linear transformationA auf sie angewendet Ax, zu erhalten und jetzt wollen Sie es so zu transformieren, dass sie wird in der Position sein würde gewesen sein, wenn Sie eine andere Transformation B IE angewendet haben. transformieren von Ax zu Bx.

Unter der Annahme, A ist invertible gelten nur BA -1BA -1 (Ax) = Bx

[Bearbeiten] zu bekommen, da Sie in Bewegung erwähnt, Sie können stattdessen über eine affine transformationsprechen (eine lineare Transformation gefolgt von einer Übersetzung). Wenn dies der Fall ist, möchten Sie sich bewegen
von Ax + C bis Bx + D.

Um dies zu tun, subtrahieren C (dh das Objekt zum Ursprung bewegen.) Gelten BA -1 und D hinzufügen:
(BA -1 ((Ax + C) - C)) + D = Bx + D

16

Check out Ken Shoemake und Tom Duff Matrix Animation and Polar Decomposition . Die Grundidee besteht darin, Transformationsmatrizen in sinnvolle Komponenten wie Dehnung, Rotation und Translation zu zerlegen und diese dann zu interpolieren.

13

Wenn Sie alle 16 Einträge Ihrer Matrix interpolieren, wird das Ergebnis seltsam aussehen, da die interpolierten Matrizen keine starren Transformationen sind (Sie erhalten Verzerrungen und Volumenverformungen). Das Richtige ist, die Translation und Rotation/Skalierung zu trennen, indem man einen Translationsvektor T und eine 3x3-Rotationsmatrix R erhält (dies funktioniert nur unter der Annahme, dass das ursprüngliche 4x4 eine starre Transformation darstellt). Dann nehmen Sie eine Eigenwertzerlegung von 3x3 R = Q'DQ (Tick bedeutet Transponieren), geben Sie eine orthogonale Q und diagonale Skalierung D. Jetzt interpolieren Sie linear T und D, während Sie slerp die Spalten von Q, und dann wieder zusammenbauen Matrix.

4

lassen Sie mich Ihre Frage umformulieren:

Sie zwischen R0 und R1 zu interpolieren müssen.

Und schlägt vor, es zu tun, wie:

Ri = AR0 + (1-a) R1

Es ist nicht gut funktionieren, als Sieger in seiner/ihrer Antwort erwähnt: Sie wird Verzerrungen und Volumenverformungen bekommen.

mathematisch (in 3D-Geometrie Kontext), Addition macht nicht viel Sinn: Was bedeutet das Hinzufügen von zwei Übersetzungsmatrix?

eine etablierte Lösung ist so zu interpolieren:

Ri = (R1 * (inverse (R0)))^a * R0

wo wir R^a als eine Operation definieren, die gibt uns eine Drehung um Vektor [kx, ky, kz] um einen * Theta-Grad.

Also wenn a = 0, Ri = R0; wenn a = 1, Ri = R1. Dies macht eine Interpolation basierend auf einer Multiplikation, die im Kontext der 3D-Geometrie natürlicher ist.

Jetzt der schwierige Teil, wie man Operation R^a darstellt. Stellt sich heraus, mit quaternion representation von R ermöglicht es uns, die Operation R^a darzustellen. basierend auf Ken Shoemakes Papier animating rotation with quaternion curves

Verwandte Themen