[OpenGL] Orienter un objet

Orienter un objet [OpenGL] - Infographie 3D - Graphisme

Marsh Posté le 16-06-2004 à 18:33:19    

Hello !!!
 
J'ai un problème en OpenGL. Voilà, c'est simple, j'essaie d'orienter un objet avec la même orientation que la surface (qui est un mesh) sur lequel il repose.
 
J'ai calculé toutes les normales aux faces de mon mesh et j'y accède juste ça pas de problème (donc pas besoin de me me dire : controle tes normales, elles sont certifiées) ... ce que j'ai du mal à faire, enfin où je pense qu'il y a l'erreur c'est pour calculer les angles des deux rotations qui correspondent au 4ème et 5ème degrés de liberté d'un solide indéformable. Donc à partir de la normale je calcule les deux angles en question avec le thérorème du cosinus ...
 
Alors voilà, des fois ça marche, et des fois pas, et tout ça ça pue les irrégularitées des fonctions du genre acos !!! J'ai rajouté à la louche des +- M_PI/2, ça marche un peu mieux, mais pas encore top ...
 
Alors voilà, je pense que si des gens ont déjà fait de l'OpenGL avant, ils vont me sortir ça facilement et moi j'arrive plus à trouver des erreurs dans ce code que voici (l'endroit où je calcule les angles fatidiques) :
 

Code :
  1. yrob = get_ground_high(xrob, zrob, ground_points, ground_flat_normals, NB_WIDTH);
  2. get_smoothed_ground_normal(xrob, zrob, ground_flat_normals, last_normals, normalerob, NB_WIDTH, SMOOTH_SIZE);
  3. directionrob[0] = cos(anglerob_y*M_PI /180);
  4. directionrob[1] = 0.;
  5. directionrob[2] = sin(anglerob_y*M_PI /180);
  6. directionrobOrtho[0] = - directionrob[2];
  7. directionrobOrtho[1] = 0.;
  8. directionrobOrtho[2] = directionrob[0];
  9. anglerob1 = acos(dotProduct(directionrobOrtho, normalerob) / (norme(directionrobOrtho) * norme(normalerob))) -(M_PI/2);
  10. // il faut faire un test sur le sinus pour savoir si le signe de l'angle est juste  
  11. /* produitVectoriel(init, directionrobOrtho, normalerob, directionTemp);
  12. if (directionTemp[1] < 0.) {  
  13. // on a le sinus négatif : vecteur négatif en y  
  14. anglerob1 = -anglerob1; } */
  15. anglerob1 = anglerob1 * 180 / M_PI;
  16. anglerob2 = acos(dotProduct(directionrob, normalerob) / (norme(directionrob) * norme(normalerob))) -(M_PI/2);
  17. /* produitVectoriel(init, directionrob, normalerob, directionTemp); if (directionTemp[1] < 0.) {  
  18. // on a le sinus négatif : vecteur négatif en y  
  19. anglerob2 = -anglerob2; } */
  20. anglerob2 = anglerob2 * -180 / M_PI;

Reply

Marsh Posté le 16-06-2004 à 18:33:19   

Reply

Marsh Posté le 16-06-2004 à 18:39:32    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed