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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top