2010-06-22 10 views
14

memorizzo la posizione di un oggetto nello spazio 3d in una matrice di trasformazione 4by4. ora per spostare l'oggetto dalla posizione memorizzata nella matrice A alla posizione memorizzata nella matrice B, vorrei interpolarli.geometria 3d: come interpolare una matrice

così faccio solo interpolando ciascuno dei 16 valori nella matrice, o devo prestare particolare attenzione a qualcosa?

grazie!

+1

Come si memorizza la "posizione" di un oggetto in una matrice di trasformazione? È una fotocamera? Maggiori informazioni richieste – Jacob

risposta

4

L'interpolazione dei valori della matrice probabilmente non ti darà quello che vuoi a meno che tu non stia facendo solo trasformazioni molto semplici (ad esempio, traduzione o ridimensionamento).

Penso che esistano metodi che scompongono una matrice in traslazione, rotazione, ridimensionamento, ecc. E quindi è possibile creare nuove matrici che interpolano in base a tali parametri.

Si potrebbe anche solo eseguire una trasformazione prima e dopo e quindi visualizzare i vertici dell'oggetto. Questo potrebbe anche non darti i risultati che stai cercando.

5

suppongo quello che stai chiedendo è, hai un oggetto x, è stato applicato un linear transformationUn ad esso per ottenere Ax, e ora si vuole trasformarla in modo tale che sarà nella posizione in cui sarebbe se hai applicato qualche altra trasformazione B ie. trasformare da Ax a Bx.

Supponendo Un è invertible, basta applicare BA -1 per ottenere BA -1 (Ax) =Bx

[Edit] Dal momento che lei ha citato in movimento, potresti invece parlare di una affine transformation(una trasformazione lineare seguita da una traduzione). Se questo è il caso, stai cercando di spostare
da Ax + C a Bx + D.

Per fare questo, sottrarre C (cioè spostare l'oggetto all'origine.), Applicare BA -1 e aggiungere D:
(BA -1 ((Ax + C) - C)) + D =Bx + D

16

Partenza Ken Shoemake e Tom Duff Matrix Animation and Polar Decomposition . L'idea di base è quella di suddividere le matrici di trasformazione in componenti significativi come l'allungamento, la rotazione e la traduzione, e quindi di interpolarli.

13

Se si interpolano tutte le 16 voci della matrice, il risultato apparirà strano poiché le matrici interpolate non saranno trasformazioni rigide (si otterranno deformazioni e deformazioni del volume). La cosa giusta da fare è separare la traslazione e la rotazione/ridimensionamento, dandoti un vettore di traduzione T e una matrice di rotazione 3x3 R (questo funziona solo supponendo che il tuo 4x4 originale rappresentasse una trasformazione rigida). Quindi prendi una scomposizione autovalore del 3x3 R = Q'DQ (tick significa trasposizione), dandoti un Q ortogonale e un ridimensionamento diagonale D. Ora interpoli linearmente T e D, mentre tu slerp le colonne di Q, e poi riassembri il matrice.

4

Mi permetta di riformulare la tua domanda:

è necessario interpolare tra R0 e R1.

E propone di farlo come:

Ri = AR0 + (1-a) R1

non funzionerà bene, come Victor citato nel suo/la sua risposta: si otterrà deformazioni di volume e di inclinazione.

matematicamente (nel contesto della geometria 3d), l'aggiunta non ha molto senso: cosa significa aggiungere due matrici di traduzione?

una soluzione stabilita è interpolare come:

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

dove definiamo R^a come un'operazione che ci dà una rotazione sul vettore [kx, ky, kz] di un grado * theta.

quindi quando a = 0, Ri = R0; quando a = 1, Ri = R1. Questo rende l'interpolazione basata sulla moltiplicazione, che è più naturale nel contesto della geometria 3d.

Ora la parte difficile su come rappresentare l'operazione R^a. Risulta che usando quaternion representation di R ci consente di rappresentare l'operazione R^a. basato sul documento di Ken Shoemake animating rotation with quaternion curves