Tengo algunos modelos que quiero rotar usando cuaterniones de la manera normal, excepto que en lugar de la rotación sobre el origen, quiero que se desplace ligeramente. Sé que no dices, en el espacio 3d, que giras alrededor de un punto; dices que giras alrededor de un eje. Así que lo estoy visualizando como girando sobre un vector cuya cola no se encuentra en el origen local.
Todas las transformaciones afines en mi motor de renderización / física se almacenan usando SQT (escala, cuaternión, traducción; una idea tomada del libro Game Engine Architecture ). Así que construyo una matriz cada cuadro a partir de estos componentes y lo paso al sombreador de vértices. En este sistema, se aplica la traducción, luego la escala, luego la rotación.
En un caso específico, necesito traducir un objeto en el espacio mundial, escalarlo y rotarlo alrededor de un vértice no centrado en el origen local del objeto.
Pregunta: Dadas las limitaciones de mi sistema actual descrito anteriormente, ¿cómo puedo lograr una rotación local centrada en un punto que no sea el origen? Votación automática a cualquiera que pueda describir cómo hacer esto usando solo matrices también :)
fuente
Respuestas:
En breve
Solo necesita cambiar T en su formulario SQT.
Reemplace el vector de traducción
v
conv' = v-invscale(p-invrotate(p))
dondev
está el vector de traducción inicial,p
es el punto alrededor del cual desea que ocurra la rotación,invrotate
yinvscale
son las inversas de su rotación y escala.Demostración rápida
Deje
p
ser el punto alrededor del cual aplica la rotaciónr
. Deje ques
sean sus parámetros de escala yv
su vector de traducción. La transformación final de la matriz es enT(p)R(r)T(-p)S(s)T(v)
lugar deR(r)S(s)T(v)
.Lo que quieres son nuevos parámetros de transformación
v'
,r'
ys'
tal que la transformación de matriz final seaR(r')S(s')T(v')
y tengamos:El comportamiento en el infinito indica que los parámetros de rotación y los parámetros de escala no pueden cambiar (esto podría demostrarse). Así tenemos
r = r'
ys = s'
. Por lo tantov'
, el único parámetro que falta es su nuevo vector de traducción:Si estas matrices son iguales, sus inversas son iguales:
Esto es especialmente cierto para el origen
O
:Al escalar y rotar el origen se obtiene el origen, donde obtenemos así:
v'
es el nuevo vector de traducción que está buscando que le permite almacenar su transformación en forma SQT. Probablemente sea posible simplificar el cálculo; pero al menos no se aumenta el almacenamiento requerido .fuente
Todas las fórmulas de rotación canónicas utilizadas para derivar sus matrices de rotación son para la rotación sobre el origen. Si, en cambio, desea aplicar esa rotación alrededor de un punto específico, primero debe compensar el origen o, de manera equivalente, mover el objeto para que el punto sobre el que desea rotar esté en el origen.
Considere el caso 2D primero, porque es más simple y la técnica se escala. Si tuviera un cubo de ancho 2 centrado en el origen y quisiera rotarlo 45 grados sobre su centro, sería una aplicación trivial de la matriz de rotación 2D .
Pero si, en cambio, quisiera rotarlo alrededor de su esquina superior derecha (ubicada en
1,1
), primero tendría que traducirlo para que esa esquina estuviera en el origen. Esto se puede lograr con una traducción de-1,-1
. Luego puede rotar el objeto como antes, pero debe seguirlo traduciéndolo (por1,1
). Entonces, en general, para lograr la matriz de rotaciónR
para una rotación der
aproximadamente el puntoP
que haces:donde
translate
yrotate
son las matrices canónicas de traslación / rotación, respectivamente. Resulta que esto se escala trivialmente a 3D, lo que con la excepción de tener que suministrar un eje a la rotación también: siempre puede elegir las matrices canónicas de rotación de los ejes X, Y o Z, pero eso sería aburrido. Querrá usar la matriz arbitraria de rotación de eje-ángulo . Tu finalR
en 3D es así:donde
a
es un vector unitario que representa el eje de rotación yP
ahora es un punto 3D en el espacio modelo que representa el punto de rotación.Como suele suceder, los cuaterniones pueden ser convertidos a y de las representaciones de la matriz, por lo que podría hacer su concatenación de esa manera si así lo elige. O simplemente puede dejar todo como matrices (los cuaterniones tienen algunas ventajas agradables, como ser más fácil de interpolar de una manera sensata, pero si lo necesita o no, depende de usted).
También:
Estrictamente hablando, mientras que los vectores se pueden usar para representar posiciones al considerarlos como desplazamientos desde un origen, los vectores no tienen posiciones en sí mismos, por lo que es un poco inusual visualizar uno como tal.
fuente