Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1376 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [OpenGL] Orienter un objet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[OpenGL] Orienter un objet

n°766320
Longfield
Posté le 16-06-2004 à 18:46:01  profilanswer
 

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

mood
Publicité
Posté le 16-06-2004 à 18:46:01  profilanswer
 

n°766371
Ace17
Posté le 16-06-2004 à 19:31:25  profilanswer
 

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.

n°766420
Longfield
Posté le 16-06-2004 à 20:48:23  profilanswer
 

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

n°766523
Ace17
Posté le 16-06-2004 à 22:16:59  profilanswer
 

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.

n°766743
Longfield
Posté le 17-06-2004 à 09:28:04  profilanswer
 

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 !!!

n°766779
Longfield
Posté le 17-06-2004 à 09:56:27  profilanswer
 

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 ???

n°767025
Longfield
Posté le 17-06-2004 à 11:58:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [OpenGL] Orienter un objet

 

Sujets relatifs
base de donnée objetprobleme de couleur alpha en opengl
Comment faire pour qu'un objet soit globalOù est ma faute? msg d'erreur("objet requis")
[OpenGL] Fenetre de description avec le curseurprobleme pour texturer une planete en opengl
ActiveX , objet dans page HTMLEventListener sur un objet window
[prog objet] utilitaires [inutiles] de schémas d'héritage[js] pb de reference objet avec setInterval
Plus de sujets relatifs à : [OpenGL] Orienter un objet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR