É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?
Répondre
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);
}
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); –
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()
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
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.
Vous voulez probablement jeter un oeil à l'article Diana Gruber's
- 1. Un éditeur pour un objet de données en swing, quel est le moyen le plus simple?
- 2. NSMutableArray. Quel est le moyen le plus rapide pour le convertir en un tableau C simple?
- 3. Dans SharePoint, quel est le moyen le plus simple de créer un fichier "schema.xml" personnalisé?
- 4. Quel est le moyen le plus simple de cloner un dépôt git vide * * vide?
- 5. Quel est le moyen le plus simple de cloner un webservice?
- 6. Quel est le moyen le plus simple d'implémenter une fonction de recherche sur un site Web?
- 7. Quel est le moyen le plus simple d'intégrer PayPal dans un système d'enregistrement?
- 8. Quel est le moyen le plus simple d'ajouter un index sur une table myISAM live?
- 9. Quel est le moyen le plus simple de programmer une période bêta sur un site?
- 10. Quel est le moyen le plus simple de lire un MP3 dans WPF?
- 11. Quel est le moyen le plus simple d'apprendre le code ActionScript lorsque vous connaissez JavaScript?
- 12. J'ai déjà installé PHP, quel est le moyen le plus simple (le meilleur) pour installer GDLib?
- 13. Quel est le meilleur, uploader le plus simple fichier ajax?
- 14. Quel est le moyen le plus simple d'utiliser le code source C dans une application Java?
- 15. Quel est le moyen le plus simple de vérifier qu'une connexion réseau est disponible?
- 16. Quel est le moyen le plus simple de styler le ScrollViewer en XAML
- 17. Quel est le moyen le plus simple de voir si un processus avec un pid donné existe en Python?
- 18. Quel est le système d'exploitation le plus simple disponible?
- 19. Quel est le moyen le plus simple d'exporter des données depuis une application google app engine?
- 20. Quel est le moyen le plus simple d'analyser les fichiers binaires dans Cocoa Touch?
- 21. Quel est le moyen le plus simple de stocker des données d'un programme Java à MySQL?
- 22. Quel est le moyen le plus simple d'ajouter des informations de version automatique aux tables MSSQL?
- 23. Quel est le moyen le plus simple de construire Python26.zip pour la distribution intégrée?
- 24. Quel est le moyen le plus simple de décrémenter une date en Javascript d'un jour?
- 25. Quel est le moyen le plus simple de charger de l'argent sur Internet?
- 26. Quel est le moyen le plus simple de décoder et d'afficher RTP (MPEG4 TS)
- 27. Quel est le moyen le plus simple de récupérer une page Web en C?
- 28. Quel est le moyen le plus simple d'écrire des applications web dans Haskell?
- 29. Quel est le moyen le plus simple d'ajouter des raccourcis clavier globaux dans Windows?
- 30. Quel est le moyen le plus simple d'offrir/de consommer des services web en jython?
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
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