2010-06-22 45 views
14

almacenamiento la posición de un objeto en un espacio 3D en una matriz de transformación 4by4. ahora para mover el objeto desde la posición almacenada en la matriz A a la posición almacenada en la matriz B, me gustaría interpolarlos.geometría 3D: cómo interpolar una matriz

así que hago esto interpolando cada uno de los 16 valores en la matriz, o tengo que tener especial cuidado con algo?

gracias!

+1

¿Cómo se almacena la "posición" de un objeto en una matriz de transformación? ¿Es esto una cámara? Se requiere más información. – Jacob

Respuesta

4

La simple interpolación de los valores de la matriz probablemente no le dará lo que desea, a menos que solo haga transformaciones muy simples (por ejemplo, traducción o escalado).

Creo que hay métodos que descomponen una matriz en la traducción, la rotación, la escala, etc. y luego puedes construir nuevas matrices que se interpolan en función de esos parámetros.

También podría hacer una transformación de antes y después, y luego leer los vértices del objeto. Esto también puede no darle los resultados que busca.

5

asumo lo que está pidiendo es decir, que tenga un objeto x, que haya aplicado un linear transformationUn a él para obtener Axe, y ahora quiere transformarlo de tal manera que estará en la posición en la que sería si ha aplicado alguna otra transformación B es decir. transformar desde Ax a Bx.

Suponiendo Un es invertible, sólo se aplica BA -1 para obtener BA -1 (Ax) =Bx

[Editar] Ya que menciona en movimiento, en su lugar, puede estar hablando de affine transformation(una transformación lineal seguida de una traducción). Si este es el caso, está buscando mover
de Ax + C a Bx + D.

Para hacer esto, restar C (es decir, mover el objeto con el origen.), Aplicar BA -1, y añadir D:
(BA -1 ((Ax + C) - C)) + D =Bx + D

16

salida Ken Shoemake y Tom Duff Matrix Animation and Polar Decomposition . La idea básica es descomponer las matrices de transformación en componentes significativos, como estiramiento, rotación y traducción, y luego interpolarlos.

13

Si interpolas las 16 entradas de tu matriz, el resultado será extraño ya que las matrices interpoladas no serán transformaciones rígidas (obtendrás deformaciones de deformación y de volumen). Lo correcto es separar la traducción y la rotación/escalado, proporcionándole un vector de traducción T y una matriz de rotación 3x3 R (esto solo funciona suponiendo que su 4x4 original representara una transformación rígida). Luego tome una descomposición del valor propio de 3x3 R = Q'DQ (tick significa transposición), que le da una Q ortogonal y una escala diagonal D. Ahora usted interpola linealmente T y D, mientras que slerp las columnas de Q, y luego vuelve a ensamblar el matriz.

4

déjeme reformular su pregunta:

que necesita para interpolar entre R0 y R1.

y proponiendo hacerlo como:

Ri = AR0 + (1-a) R1

no va a funcionar bien, como se ha mencionado vencedor en su/su respuesta: obtendrá deformaciones de inclinación y de volumen.

matemáticamente (en el contexto de geometría 3D), además no tiene mucho sentido: ¿qué significa agregar dos matrices de traducción?

una solución establecida es interpolar como:

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

donde definimos R^a como una operación que nos da una rotación sobre el vector [kx, ky, kz] por a * theta degrees.

así que cuando a = 0, Ri = R0; cuando a = 1, Ri = R1. Esto hace que la interpolación se base en la multiplicación, que es más natural en el contexto de la geometría 3D.

Ahora la parte difícil de la forma de representar la operación R^a. Resulta que usando quaternion representation de R nos permite representar la operación R^a. basado en el documento de Ken Shoemake animating rotation with quaternion curves

Cuestiones relacionadas