J'ai certains modèles que je veux faire tourner en utilisant des quaternions de la manière normale, sauf qu'au lieu de faire une rotation autour de l'origine, je veux qu'il soit légèrement décalé. Je sais que vous ne dites pas, dans l'espace 3D, que vous tournez autour d'un point; vous dites que vous tournez autour d'un axe. Je le visualise donc comme tournant autour d'un vecteur dont la queue n'est pas positionnée à l'origine locale.
Toutes les transformations affines de mon moteur de rendu / physique sont stockées à l'aide de SQT (échelle, quaternion, traduction; une idée empruntée au livre Game Engine Architecture .) Je construis donc une matrice chaque image à partir de ces composants et la passe au vertex shader. Dans ce système, la translation est appliquée, puis l'échelle, puis la rotation.
Dans un cas spécifique, j'ai besoin de traduire un objet dans l'espace mondial, de le mettre à l'échelle et de le faire pivoter autour d'un sommet non centré sur l'origine locale de l'objet.
Question: Compte tenu des contraintes de mon système actuel décrites ci-dessus, comment puis-je réaliser une rotation locale centrée sur un point autre que l'origine? Upvote automatique à tous ceux qui peuvent décrire comment le faire en utilisant uniquement des matrices :)
la source
Réponses:
En bref
Il vous suffit de changer T dans votre formulaire SQT.
Remplacez le vecteur de translation
v
parv' = v-invscale(p-invrotate(p))
oùv
est le vecteur de translation initial,p
est le point autour duquel vous souhaitez que la rotation se produise, etinvrotate
etinvscale
sont les inverses de votre rotation et de votre échelle.Démonstration rapide
Soit
p
le point autour duquel vous appliquez la rotationr
. Soits
vos paramètres d'échelle etv
votre vecteur de traduction. La transformation de matrice finale estT(p)R(r)T(-p)S(s)T(v)
au lieu deR(r)S(s)T(v)
.Ce que vous voulez, ce sont de nouveaux paramètres de transformation
v'
,r'
ets'
tels que la transformation finale de la matrice soitR(r')S(s')T(v')
et nous avons:Le comportement à l'infini indique que les paramètres de rotation et les paramètres d'échelle ne peuvent pas changer (cela pourrait être démontré). Nous avons donc
r = r'
ets = s'
. Le seul paramètre manquant est doncv'
votre nouveau vecteur de traduction:Si ces matrices sont égales, leurs inverses sont égales:
Cela est particulièrement vrai pour l'origine
O
:La mise à l'échelle et la rotation de l'origine donne l'origine, on obtient ainsi:
v'
est le nouveau vecteur de traduction que vous recherchez qui vous permet de stocker votre transformation sous forme SQT. Il est probablement possible de simplifier le calcul; mais au moins le stockage requis n'est pas augmenté.la source
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 (par1,1
). Donc, en général, pour atteindre la matrice de rotationR
pour une rotation d'r
environ un point,P
vous faites:où
translate
etrotate
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 finaleR
en 3D est donc:où
a
est un vecteur unitaire représentant l'axe de rotation etP
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:
À 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.
la source