2008-10-11 8 views
3

Étant donné un point tel que (0, 0, 0) et un vecteur comme (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écessaires.Quel est le moyen le plus simple d'aligner l'axe Z avec un vecteur?

+0

pas sûr que je comprends votre question, voulez-vous dire tourner les axes de sorte que l'axe z se trouve dans la direction du vecteur entre (0,0,0) et (x, y, z)? – Simon

+0

Presque, mais pas tout à fait. J'ai un vecteur (x, y, z) qui décrit la direction vers laquelle je veux que l'axe z pointe. Est-ce plus clair? – fluffels

Répondre

13

Il y a beaucoup de différentes manières de faire pivoter un cadre de coordonnées pour pointer dans une direction donnée; ils vont tous quitter l'axe z pointé dans la direction que vous voulez, mais avec des variations dans la façon dont les axes x et y sont orientés.

Ce qui suit vous obtient la plus courte rotation, ce qui peut ou peut 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); 
} 
+1

Merci pour la réponse. Mais notez que pour openGL, glRotatef prend * angle * (pas le rayon), donc il doit être glRotatef (-rot_angle/PI * 180, rot_axis.x, rot_axis.y, rot_axis.z); –

1

Pour répondre à ma propre question, la meilleure réponse que je suis venu avec ceci:

Diviser le vecteur jusqu'à en « composants ». La composante x est le déplacement le long de l'axe x. Si nous passons à la trigonométrie, nous avons cette cos (alpha) = x/vector_magnitude. Si nous calculons le RHS alors nous pouvons dériver l'alpha, qui est la quantité par laquelle nous devrions tourner autour de l'axe y.

Ensuite, le système de coordonnées peut être aligné sur le vecteur par une série d'appels à glRotatef()

0

Il existe beaucoup de ressources sur la rotation de vos coordonnées (ou des objets en rotation, ce qui équivaut à la même chose). J'ai appris beaucoup de this site, à la fois sur la façon de programmer en plusieurs dimensions et surtout how to manipulate vectors

0

La page here a une section « transformations pour déplacer un vecteur à l'axe z » qui semble être ce que vous voulez, ou peut-être l'inverse de cela.

Questions connexes