[OpenGL] Normales

Normales [OpenGL] - Programmation

Marsh Posté le 11-03-2001 à 17:10:25    

C'est bien beau les normales indispensables pour que les lumières soient bien rendues, mais comment les calculer rapidement?
 
J'arrive facilement à trouver leurs coordonnées quand je travaille avec un cube, mais comment trouver les coordonnés pour une pyramide par exemple? Ou pour tout autre objet dont les cotés ne sont pas parallèles à un des axes du repère?

Reply

Marsh Posté le 11-03-2001 à 17:10:25   

Reply

Marsh Posté le 11-03-2001 à 17:19:36    

tu calcules la normale d'un triangle.Tu as les 3 sommets du triangle donc tu peux obtenir la normal du triangle en faisant un produit vectoriel.


---------------
http://www.chadenat.forez.com
Reply

Marsh Posté le 11-03-2001 à 17:21:31    

Pour un cube ou une pyramide, préciser les normales est inutile puisque ce sont des objets facettés.
 
Par contre si tu veux dessiner une sphère (ou une surface "douce" ) avec un ensemble de polygones, les normales ne doivent  plus êtres celles des polygones pour un meilleur rendu.

Reply

Marsh Posté le 11-03-2001 à 17:42:37    

chadenat > c'est quoi un produit vectoriel? :)
 
Verdoux > donc si je comprends bien, si j'utilise glBegin (GL_TRIANGLES) ou glBegin (GL_QUADS) ça ne sert à rien de préciser en plus les normales?

Reply

Marsh Posté le 11-03-2001 à 18:09:25    

Pour une sphère Verdoux a raison il faut dire que les normales passent par le centre....
 
Sinon pour le produit vectoriel regarde dans un livre de math...


---------------
http://www.chadenat.forez.com
Reply

Marsh Posté le 11-03-2001 à 18:30:19    

Ben j'suis qu'en 1ère. On a pas du tout fait les produits vectoriels.

Reply

Marsh Posté le 11-03-2001 à 18:55:28    

La normale d'un triangle se calcule par le produit vectoriel AB^AC par exemple où A, B et C sont les 3 sommets.
Si AB(x, y, z) et AC(x', y', z' ) alors  
AB^AC = (yz'-y'z, zx'-z'x, xy'-x'y)
En général la normale est normée.
 
Le calcul des lumières nécessite de connaître les normales aux sommets et non aux triangles. Pour les obtenir, il suffit de moyenner les normales des triangles auxquels le sommet appartient.
 
Maintenant il est inutile d'effectuer les calculs à chaque trame, il suffit juste de transformer les normales comme les autres sommets de l'objet.

 

[edit]--Message édité par z51--[/edit]

Reply

Marsh Posté le 11-03-2001 à 19:16:23    

Oui en 1ère ou en même en terminale, on voit pas les maths utiles pour la 3D (espaces vectoriels normés, matrices).

 

[edit]--Message édité par Verdoux--[/edit]

Reply

Marsh Posté le 11-03-2001 à 22:50:39    

voici un exemple en c qui marche :
 
pour faire une surface toute lissée (genre une sphere), il faut faire la moyenne des normales. normalement il y a une normale par face mais la on en calcul une pour chaque point. c'est la somme des normales des faces ou se trouve le point (en gros).
 
// -----------------------------------------------------------------------------
void Calcul_Normale(double* a,double* b,double* c,double* n) {
 // paramètre : trois points a,b et c (tableau de 3 valeurs)
 // les point sont donnés dans l'ordre anti-horaire, si c'est  
 // pas le bon sens, ben il faut inverser les points
  double v[3],w[3];
  double lng=0;
 
  v[0]=c[0]-a[0];
  v[1]=c[1]-a[1];
  v[2]=c[2]-a[2];
  w[0]=b[0]-a[0];
  w[1]=b[1]-a[1];
  w[2]=b[2]-a[2];
 
  n[0]=v[1]*w[2] - w[1]*v[2];
  n[1]=v[2]*w[0] - w[2]*v[0];
  n[2]=v[0]*w[1] - w[0]*v[1];
  lng=sqrt((n[0]*n[0])+(n[1]*n[1])+(n[2]*n[2]));
  if (lng>0) {
    lng=1/lng;
    n[0]=n[0]*lng;
    n[1]=n[1]*lng;
    n[2]=n[2]*lng;
    }}
//------------------------------------------------------------------------------

Reply

Sujets relatifs:

Leave a Replay

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