geometry - puntos - Geometría 3D: cómo interpolar una matriz
interpolar formula (5)
Guardo 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.
Entonces, ¿hago esto interpolando cada uno de los 16 valores en la matriz, o tengo que tener especial cuidado con algo?
¡Gracias!
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 traducción, rotación, escalado, 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 antes y después, y luego aplicar los vértices del objeto. Esto también puede no darle los resultados que busca.
Supongo que lo que estás preguntando es, tienes un objeto x , has aplicado una transformación lineal A para obtener Ax , y ahora quieres transformarlo de modo que esté en la posición en la que habría estado si aplicaste alguna otra transformación B ie. transformar de Ax a Bx .
Suponiendo que A es invertible , solo aplique BA -1 para obtener BA -1 (Ax) = Bx
[Editar] Dado que mencionaste el movimiento, puedes estar hablando de una transformación afín (una transformación lineal seguida de una traducción) . Si este es el caso, estás buscando moverte
de Ax + C a Bx + D.
Para hacer esto, reste C (es decir, mueva el objeto al origen), aplique BA -1 y agregue D :
(BA -1 ((Ax + C) - C)) + D = Bx + D
Echa un vistazo a Ken Shoemake y Tom Duff''s 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.
Si interpolas las 16 entradas de tu matriz, el resultado parecerá 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 transponer), que le da una Q ortogonal y una escala diagonal D. Ahora usted interpola linealmente a T y D, mientras que slerp las columnas de Q, y luego vuelve a ensamblar el matriz.
déjame reformular tu pregunta:
necesita interpolar entre R0 y R1.
Y proponiéndome hacerlo como:
Ri = aR0 + (1-a) R1
No funcionará bien, como vencedor mencionó en su respuesta: obtendrá deformaciones de inclinación y volumen.
matemáticamente (en el contexto de geometría 3D), la suma no tiene mucho sentido: ¿qué significa agregar dos matrices de traducción?
una solución establecida es interpolar como:
Ri = (R1 * (inverso (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.
entonces 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 más difícil de cómo representar la operación R ^ a. Resulta que al usar quaternion la representación de R nos permite representar la operación R ^ a. basado en la rotación de animación de papel de Ken Shoemake con curvas de cuaternión