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 (por 1,1
). Entonces, en general, para lograr la matriz de rotación R
para una rotación de r
aproximadamente el punto P
que haces:
R = translate(-P) * rotate(r) * translate(P)
donde translate
y rotate
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 final R
en 3D es así:
R = translate(-P) * rotate(a,r) * translate(P)
donde a
es un vector unitario que representa el eje de rotación y P
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:
Así que lo estoy visualizando como girando sobre un vector cuya cola no se encuentra en el origen local.
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.