J'écris un programme qui dessine un solide le long de la courbe d'une spline. J'utilise Visual Studio 2005, et j'écris en C++ pour OpenGL. J'utilise FLTK pour ouvrir mes fenêtres (toolkit rapide et léger).Trouver des angles de rotation entre des points 3d
J'ai actuellement un algorithme qui va dessiner une spline cardinale cubique, donné un ensemble de points de contrôle, en séparant les intervalles entre les points en sous-intervalles et en dessinant des segments entre ces sous-points. Le nombre de sous-intervalles est variable. Le code de dessin fonctionne à merveille et fonctionne comme suit: Je génère un ensemble de points le long de la courbe spline en utilisant l'équation de spline et les stocke dans un tableau (comme une structure de données spéciale appelée Pnt3f, où les coordonnées sont 3). flotte et il y a quelques fonctions pratiques telles que la distance, la longueur, le point et le crossproduct). Ensuite, j'ai une seule boucle qui itère à travers le réseau de points et les dessine comme si:
glBegin(GL_LINE_STRIP);
for(pt = 0; pt<=numsubsegements ; ++pt) {
glVertex3fv(pt.v());
}
glEnd();
Comme indiqué, ce code fonctionne très bien. Maintenant ce que je veux faire est, au lieu de tracer une ligne, je veux extruder un solide. Mon exploration actuelle utilise un quadricycle 'cylindre' pour créer un tube le long de la ligne. C'est un peu plus compliqué, car je dois orienter openGL dans la direction où je veux dessiner le cylindre. Mon idée est de faire ceci:
psuedocode:
Push the current matrix,
translate to the first control point
rotate to face the next point
draw a cylinder (length = distance between the points)
Pop the matrix
repeat
Mon problème est d'obtenir les angles entre les points. J'ai seulement besoin de lacet et de hauteur, le roulement n'est pas important. Je sais prendre l'arc-cosinus du produit scalaire des deux points divisé par la magnitude des deux points, retournera l'angle entre eux, mais ce n'est pas quelque chose que je peux nourrir à OpenGL pour tourner avec. J'ai essayé de le faire en 2d, en utilisant le plan XZ pour obtenir x rotation, et en faisant les points vecteurs de l'origine, mais cela ne retourne pas l'angle correct.
Mon approche actuelle est beaucoup plus simple. Pour chaque plan de rotation (X et Y), pour l'angle par:
-arc cosinus ((différence de la valeur de 'x')/distance entre les points)
la valeur 'x' dépend de la vous mettez votre avion en place, mais pour mes calculs, j'utilise toujours world x. À moins de quelques problèmes, ce qui fait que je dessine dans le quadrant correct que je n'ai pas encore élaboré, je veux obtenir des conseils pour voir si c'était une bonne implémentation, ou pour voir si quelqu'un savait mieux.
Cela ne semble pas fonctionner –