Pregunta

Tengo una línea (en realidad un cubo) que va de (x1, y1, z1) a (x2, y2, z2). Me gustaría girarlo para que esté alineado a lo largo de otra línea que va de (x3, y3, z3) a (x4, y4, z4). Actualmente estoy usando Math :: Atan2 junto con Matrix :: RotateYawPitchRoll . ¿Alguna forma mejor de hacer esto?

Edit: Creo que he redactado muy mal esta publicación. Lo que realmente estoy buscando es una Matriz de Rotación a partir de dos Vectores.

¿Fue útil?

Solución

Sí, puedes hacer esto sin necesidad de pensar en términos de ángulos.

Como tiene un cubo, suponga que elige una esquina y luego define los 3 bordes que irradian de ella como vectores f0, f1, f2 (estos son vectores de dirección, relativos a la esquina que ha elegido). Normalícelos y escríbalos como columnas en una matriz F

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

Ahora haga lo mismo para los vectores t0, t1, t2 del cubo que desea rotar y llámelo matriz T.

Ahora, la matriz R = T * Inversa (F) es la matriz que gira desde la orientación del primer cubo a la orientación del segundo (porque la F inversa se asigna, por ejemplo, f0 a (1 0 0) ', y luego T mapas (1 0 0) 'a t0).

Si desea saber por qué funciona esto, piense en términos de vectores de base de sistemas de coordenadas: si desea rotar los ejes XY y Z a un nuevo sistema de coordenadas, las columnas de la matriz de rotación son solo los vectores que desea (1 0 0) ', (0 1 0)' & amp; (0 0 1) 'para ser asignado a. T * Inverse (F) está girando efectivamente su cubo desde su orientación original hasta el eje alineado, y luego hacia la orientación deseada.

(Lo sentimos, lo anterior es para vectores de columna y transformaciones a la izquierda, estilo OpenGL. Me parece recordar que Direct3D son vectores de fila y transformaciones a la derecha, pero debería ser obvio cómo cambiarlo).

También se aplica igualmente a matrices 4x4 con un componente de traducción también.

Otros consejos

Es posible que desee agregar cómo interpolar las matrices. Las matrices de origen y destino están bien en su respuesta, pero calcular lo inverso no tiene sentido. Los cuaterniones le darán la ruta de rotación más corta, así que tome las matrices de rotación 3x3 en ambas matrices, conviértalas en cuaterniones y repáselas. Hacer un lerp separado para la traducción y recomponer. Google para quaternion - matrices y conversiones de respaldo y quaternion lerp.

Editar: una matriz de rotación desde un vector hacia adelante y hacia arriba es trivial. La columna que falta es el producto cruzado de los otros dos vectores. (No te olvides de normalizar columnas).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top