2011-07-04 5 views
1

J'essaye de rendre quelques graphiques 3d avec un tas de tetrahedra. J'essaie de comprendre comment faire pivoter un tétraèdre de telle sorte qu'il soit parfaitement face à face avec un autre tétraèdre. Si cela est déroutant, de multiples tétraèdres se rencontrant face à face ressembleraient à this. J'utilise OpenGL pour faire pivoter des objets par programme, donc je ne peux tourner que sur l'un des trois axes à la fois. Par exemple, je peux tourner dans le sens horaire 20 degrés sur X, puis dans le sens antihoraire 45 degrés sur Z, etc.Rotation de Tetrehedra pour la tessellation 3D

Je comprends l'aspect programmation de ce programme (en utilisant la fonction glRotatef() d'OpenGL pour tourner sur un axe à la fois), mais je suis plus intéressé par les angles spécifiques nécessaires pour chaque axe afin de réaliser la tessellation 3d.

Merci pour toute aide, laissez-moi savoir si vous avez besoin de plus de précisions.

Répondre

3

Si elles doivent être parfaitement face à face, je n'essaierai pas de trouver une rotation du tout. Au lieu de cela, je commencerais par un tétraèdre. Décidez quel visage est partagé avec le suivant.

Prendre le produit croisé de deux arêtes sur cette face (50% de chance qu'elle pointe dans la direction du 4ème point, dans ce cas inverser le vecteur). Normaliser. Multipliez par sqrt (6)/3 * edge_length (ceci est une constante, précalcul!).

Vous avez maintenant un vecteur pointant dans la direction du 4ème sommet du nouveau tétraèdre (les 3 autres que vous connaissez déjà, ils sont identiques à ceux sur le visage!), Avec la longueur de la hauteur du nouveau tétraèdre. Tout ce dont vous avez besoin maintenant est une origine pour votre vecteur: Prenez la moyenne arithmétique des coordonnées des 3 sommets partagés, qui donneront le point central de cette face. Ajoutez le vecteur à ce point, en vous donnant le point final.

Maintenant, vous deux tétraèdres partageant une face (quelle que soit l'orientation), aucune maths de rotation nécessaire.

+0

Merci Damon. Le problème est que j'essaie d'ajouter et de supprimer des tétraèdres supplémentaires au moment de l'exécution (cela devrait probablement l'être), et chaque tétraèdre doit être associé à exactement une instance d'un objet Tetrahedron (pour que je puisse appeler tetra.draw()). Est-ce que ça a du sens? Des modifications possibles à votre solution intéressante? –

+0

Fondamentalement, on pourrait toujours faire la même chose, tant qu'il y a toujours quelque chose à se connecter. Pour avoir une instance séparée, il suffit de dupliquer 3 sommets existants (ceux sur le visage où vous voulez vous connecter), et de calculer le 4ème comme décrit ci-dessus. La longueur de l'arête ne peut pas changer pendant l'exécution, ou vous ne pouvez pas les connecter correctement, donc la hauteur reste une constante précompatible. – Damon

+0

Donc, je devrais probablement toujours créer une instance d'un Tetrahedron en passant au constructeur l'instance d'un tétraèdre adjacent, et le bord spécifique auquel le nouveau est adjacent. Cela semble acceptable. Merci! –