Je suis suivi de 3 points (3D, x y z) sur un corps rigide, que j'utilise pour définir un système de coordonnées local. J'utilise l'orientation de ce système de coordonnées local (dans le référentiel global) pour définir l'orientation de la vue dans un programme VR. Pour ce faire, et éviter les verrous de cardan avec des angles d'Euler, j'essaye d'utiliser un quaternion pour définir l'orientation de la vue.Matrice de rotation à équivalence quaternaire
Je crée une matrice de rotation à partir des 3 points, puis j'utilise cette méthode décrite au Wikipedia pour extraire le quaternion supposé équivalent. Je définis alors simplement l'orientation de la vue comme étant le quaternion calculé. Cependant, ce que j'observe, c'est qu'il n'y a principalement qu'un seul degré de liberté (tangage) quand je devrais aussi être capable de voir simultanément les changements dans le lacet et le roulis. J'ai extrait les angles d'Euler de la matrice de rotation, et cela fonctionne bien sauf au cardan-lock. Donc je suis certain que la matrice de rotation est utilisable, bien que ce soit incorrect dans mon cas.
Ma question est la suivante: pourquoi le quaternion supposé équivalent ne semble-t-il que changer le degré de liberté de «hauteur»?
Je suis conscient qu'un quaternion est une rotation autour de 1 axe, mais je pensais que si elle était dérivée de la matrice de rotation, le résultat final serait le même que pour régler les angles d'Euler?
Voici mon code en python:
import viz
import numpy as np
vec1 = np.array([-0.96803,-0.25022,0.01751],dtype=float)
vec3 = np.array([-0.024815,0.96553,0.07863],dtype=float)
vec4 = np.array([-0.03655,0.07178,-0.99675],dtype=float)
#normalize to unit length
vec1 = vec1/np.linalg.norm(vec1)
vec3 = vec3/np.linalg.norm(vec3)
vec4 = vec4/np.linalg.norm(vec4)
M1 = np.zeros((3,3),dtype=float) #rotation matrix
#rotation matrix setup
M1[:,0] = vec1
M1[:,1] = vec3
M1[:,2] = vec4
#get the real part of the quaternion first
r = np.math.sqrt(float(1)+M1[0,0]+M1[1,1]+M1[2,2])*0.5
i = (M1[2,1]-M1[1,2])/(4*r)
j = (M1[0,2]-M1[2,0])/(4*r)
k = (M1[1,0]-M1[0,1])/(4*r)
viz.MainView.setQuat(i,j,k,r)
Toute aide ou des idées serait génial!
Les maths me semblent OK. Je suis un peu confus. Comparez-vous la rotation de votre matrice avec votre rotation du quaternion? Si les résultats sont les mêmes, il semblerait que les degrés de liberté limités seraient un problème avec votre choix de matrice. –
@ bob.sacamento Je cherche simplement à exprimer la matrice de rotation comme un quaternion. Je ne suis pas sûr à 100% que c'est la bonne façon de l'exprimer. Dans le code que je n'ai pas affiché, j'ai pu déterminer les angles d'Euler à partir de la matrice, donc je pense que je l'ai construit correctement. Y a-t-il d'autres façons de construire la matrice qui affecterait les choses? – willpower2727
Ce n'est pas une matrice de rotation. Problème mineur: Les lignes ne sont pas orthogonales entre elles (mais elles sont proches). Gros problème: Le déterminant est -1 (ou proche de celui-ci). Comment avez-vous formé cette matrice? –