Toutes les formules de rotation canoniques utilisées pour dériver vos matrices de rotation sont destinées à la rotation autour de l'origine. Si vous souhaitez plutôt appliquer cette rotation autour d'un point spécifique, vous devez d'abord décaler l'origine - ou, de manière équivalente, déplacer l'objet de sorte que le point sur lequel vous souhaitez tourner se trouve à l'origine.
Considérons d'abord le cas 2D, car il est plus simple et la technique évolue. Si vous aviez un cube de largeur 2 centré sur l'origine et que vous vouliez le faire pivoter de 45 degrés autour de son centre, ce serait une application triviale de la matrice de rotation 2D .
Mais si à la place vous vouliez le faire pivoter autour de son coin supérieur droit (situé à 1,1
), vous devriez d'abord le traduire pour que ce coin soit à l'origine. Cela peut être accompli avec une traduction de -1,-1
. Ensuite, vous pouvez faire pivoter l'objet comme précédemment, mais vous devez suivre cela en le traduisant en arrière (par 1,1
). Donc, en général, pour atteindre la matrice de rotation R
pour une rotation d' r
environ un point, P
vous faites:
R = translate(-P) * rotate(r) * translate(P)
où translate
et rotate
sont les matrices canoniques de translation / rotation, respectivement. En l'occurrence, cela évolue trivialement en 3D, à l'exception du fait de devoir également fournir un axe à la rotation - vous pouvez toujours choisir les matrices canoniques de rotation des axes X, Y ou Z, mais ce serait terne. Vous voudrez utiliser la matrice de rotation axe-angle arbitraire . Votre finale R
en 3D est donc:
R = translate(-P) * rotate(a,r) * translate(P)
où a
est un vecteur unitaire représentant l'axe de rotation et P
est maintenant un point 3D dans l'espace objet représentant le point de rotation.
En l'occurrence, les quaternions peuvent être convertis vers et à partir de représentations matricielles, vous pouvez donc effectuer votre concaténation de cette façon si vous le souhaitez. Ou vous pouvez simplement tout laisser sous forme de matrices (les quaternions ont de beaux avantages, comme être plus faciles à interpoler de manière saine, mais vous en avez besoin ou non).
Aussi:
Je le visualise donc comme tournant autour d'un vecteur dont la queue n'est pas positionnée à l'origine locale.
À strictement parler, alors que les vecteurs peuvent être utilisés pour représenter des positions en les considérant comme des déplacements par rapport à une origine, les vecteurs n'ont pas eux-mêmes de positions, il est donc un peu inhabituel d'en visualiser une en tant que telle.