Quel est le moyen le plus simple d’aligner l’axe Z sur un vecteur?
Question
Soit un point tel que (0, 0, 0) et un vecteur tel que (x, y, z). Quel est le moyen le plus simple d’aligner l’axe Z négatif centré sur (0, 0, 0) pour pointer dans la direction de ce vecteur? Des exemples utilisant OpenGL seraient les bienvenus, mais pas nécessairement.
La solution
Il existe de nombreuses façons différentes de faire pivoter un cadre de coordonnées pour le diriger dans une direction donnée; ils laisseront tous l'axe z dirigé dans la direction souhaitée, mais avec des variations dans l'orientation des axes x et y.
Ce qui suit vous donne la rotation la plus courte, ce qui peut être ou ne pas être ce que vous voulez.
vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}
Autres conseils
Vous souhaitez probablement consulter l'article de Diana Gruber
Pour répondre à ma propre question, la meilleure réponse que j'ai trouvée est la suivante:
Divisez le vecteur en "composants". La composante x est le déplacement le long de l'axe x. Si nous nous tournons vers la trigonométrie, nous avons cette cos (alpha) = x / vector_magnitude. Si nous calculons le RHS, nous pouvons alors obtenir un alpha, qui correspond à la quantité de rotation nécessaire autour de l’axe des y.
Ensuite, le système de coordonnées peut être aligné sur le vecteur par une série d'appels à glRotatef ()
Il existe de nombreuses ressources sur la rotation de vos coordonnées (ou la rotation d'objets, ce qui revient au même). J'ai beaucoup appris de de ce site , sur la programmation Plusieurs dimensions et en particulier comment manipuler des vecteurs
La page ici comporte une section " Transformations pour déplacer une vecteur à l'axe z " cette semble être ce que vous voulez, ou peut-être l'inverse de celui-ci.