[OpenGL] Orienter un objet

Orienter un objet [OpenGL] - C - Programmation

Marsh Posté le 16-06-2004 à 18:46:01    

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.    
  4.   directionrob[0] = cos(anglerob_y*M_PI /180); 
  5.   directionrob[1] = 0.; 
  6.   directionrob[2] = sin(anglerob_y*M_PI /180); 
  7.  
  8.   directionrobOrtho[0] = - directionrob[2]; 
  9.   directionrobOrtho[1] = 0.; 
  10.   directionrobOrtho[2] = directionrob[0]; 
  11.  
  12.   anglerob1 = acos(dotProduct(directionrobOrtho, normalerob) / (norme(directionrobOrtho) * norme(normalerob))) -(M_PI/2); 
  13.  
  14.   // il faut faire un test sur le sinus pour savoir si le signe de l'angle est juste   
  15.   /* produitVectoriel(init, directionrobOrtho, normalerob, directionTemp);
  16.    if (directionTemp[1] < 0.) {   
  17.   // on a le sinus négatif : vecteur négatif en y   
  18.   anglerob1 = -anglerob1; } */ 
  19.   anglerob1 = anglerob1 * 180 / M_PI; 
  20.  
  21.   anglerob2 = acos(dotProduct(directionrob, normalerob) / (norme(directionrob) * norme(normalerob))) -(M_PI/2); 
  22.   /* produitVectoriel(init, directionrob, normalerob, directionTemp); if (directionTemp[1] < 0.) {   
  23.   // on a le sinus négatif : vecteur négatif en y   
  24.   anglerob2 = -anglerob2; } */ 
  25.   anglerob2 = anglerob2 * -180 / M_PI;


 
j'ai déjà posté dans Graphisme, mais j'ai cru comprende que les gens là-bas n'aimaient pas trop le C !!! :D

Reply

Marsh Posté le 16-06-2004 à 18:46:01   

Reply

Marsh Posté le 16-06-2004 à 19:31:25    

Ne passe PAS par les angles, utilise des matrices de rotation ou des quaternions, sinon tu vas te les trainer dans tout ton code, ces irrégularités dont tu parles.

Reply

Marsh Posté le 16-06-2004 à 20:48:23    

Ben j'utilise les primitives OpenGL, enfin surtout glRotate*, et pour ce glRotate, je suis bien obligé de calculer les angles ...
 
comment faire autrement ???

Reply

Marsh Posté le 16-06-2004 à 22:16:59    

En utilisant des matrices de rotations. C'est rare d'utiliser les angles pour orienter un objet dans les applications 3d, pour te répondre, on utilise les matrices de rotation (ou les quaternions) a la place. glRotate ne fait que calculer a ta place cette matrice de rotation, en fonction de l'angle que tu lui donnes.

Reply

Marsh Posté le 17-06-2004 à 09:28:04    

Ok, c'est bien tout ça, mais je veux pas faire le gros boulet, mais y me faudrait un exemple pour calculer tout ça et ensuite quand même faire mon glRotate parce que tout le reste de mon programme utilise la matrice d'Opengl ...
 
un exemple de code serait très bienvenu ... merci beaucoup !!!

Reply

Marsh Posté le 17-06-2004 à 09:56:27    

en fait, ce qu'il me faudrait, c'est étant donné un vecteur, calculer la matrice qui donne la même orientation que ce vecteur, et ensuite appliquer cette matrice à la matrice de base OpenGl !!!
 
Quelqu'un sait-il faire ça ???

Reply

Marsh Posté le 17-06-2004 à 11:58:08    

c'est bon, en me creusant bien la tête, mais alors vraiment bien, j'ai réussi à cacluler la matrice et grâce à la fonction glMultMatrixf je peux l'appliquer directement à ma matrice OpenGL

Reply

Sujets relatifs:

Leave a Replay

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