En y réfléchissant davantage, les valeurs des accéléromètres sont les composantes du vecteur que je cherchais ... Il suffit d'exprimer l'arc le plus court entre un vecteur de référence et ce vecteur en tant que quaternion.
Par exemple, si accel
est un (normalisé) vecteur contenant les valeurs de l'accéléromètre:
reference = Vector3(0, 0, 1)
axis = crossp(accel, reference)
angle = acos(dotp(accel, reference))
q = Quaternion::from_xyzr(axis, angle)
rotation_matrix = q.matrix()
J'ai choisi {0, 0, 1} comme vecteur de référence, car ce sont les valeurs des accéléromètres à "position de repos" (Wiimote sur une table, pointant vers vous). Cela donne le même genre de mouvements que la conversion pitch/roll des accéléromètres X/Z, mais sans verrouillage à la cardan dans les positions verticales. Le seul problème est que vous n'obtenez pas d'informations sur les rotations effectuées sur l'axe de gravité de la Terre ... Je suppose que c'est ce que le MotionPlus est fait pour.
Wii MotionPlus offre un contrôle plus fin. – geowa4
Oui, je sais, mais je me demande pourquoi vous ne pouvez pas obtenir une information en 3 dimensions à partir de quelque chose qui a 3 capteurs indépendants ... –