Tutte le formule di rotazione canoniche utilizzate per derivare le matrici di rotazione sono per la rotazione attorno all'origine. Se invece desideri applicare quella rotazione attorno a un punto specifico, devi prima compensare l'origine o, equivalentemente, spostare l'oggetto in modo che il punto su cui vuoi ruotare sia all'origine.
Considera prima il caso 2D, perché è più semplice e la tecnica si ridimensiona. Se avessi un cubo di larghezza 2 centrato sull'origine e volessi ruotarlo di 45 gradi attorno al suo centro, sarebbe una banale applicazione della matrice di rotazione 2D .
Ma se invece volessi ruotarlo attorno all'angolo in alto a destra (situato in 1,1
), dovresti prima tradurlo in modo che quell'angolo fosse all'origine. Questo può essere realizzato con una traduzione di -1,-1
. Quindi puoi ruotare l'oggetto come prima, ma devi seguirlo traducendolo indietro (di 1,1
). Quindi, in generale, per ottenere la matrice di rotazione R
per una rotazione di r
circa il punto P
si fa:
R = translate(-P) * rotate(r) * translate(P)
dove translate
e rotate
sono le matrici di traduzione / rotazione canoniche, rispettivamente. A quanto pare, questo si ridimensiona in modo banale rispetto al 3D, che a parte il fatto di dover fornire un asse anche alla rotazione - potresti sempre scegliere le matrici di rotazione degli assi X, Y o Z canoniche, ma sarebbe noioso. Ti consigliamo di utilizzare la matrice di rotazione arbitraria dell'angolo dell'asse . Il tuo finale R
in 3D è quindi:
R = translate(-P) * rotate(a,r) * translate(P)
dove a
è un vettore unitario che rappresenta l'asse di rotazione e P
ora è un punto 3D nello spazio modello che rappresenta il punto di rotazione.
In questo caso, i quaternioni possono essere convertiti in e da rappresentazioni di matrici, in modo che tu possa fare la tua concatenazione in quel modo se lo desideri. Oppure potresti semplicemente lasciare tutto come matrici (i quaternioni hanno alcuni bei vantaggi come essere più facili da interpolare in modo sano, ma se hai bisogno o no dipende da te).
Anche:
Quindi lo sto visualizzando come ruotante attorno a un vettore la cui coda non è posizionata sull'origine locale.
A rigor di termini, mentre i vettori possono essere usati per rappresentare posizioni considerandole come spostamenti da un'origine, i vettori non hanno posizioni stesse, quindi è un po 'insolito visualizzarne una come tale.