[OpenGL] The Normals Come Back

The Normals Come Back [OpenGL] - Programmation

Marsh Posté le 23-03-2001 à 18:34:57    

Et oui, encore un petit post sur les normals.
:)
 
Bon, j'ai un triangle ABC.
Je fais le produit vectoriel AB*AC.
Je récupère x, y et z.
Je divise ces x, y et z par racine(x² + y² + z²) et je récupère x', y' et z'.
 
Je peux donc mettre:
 
glBegin (GL_TRIANGLES);
glNormal3f (x', y', z' ); glVertex3fv (A);
glNormal3f (x', y', z' ); glVertex3fv (B);
glNormal3f (x', y', z' ); glVertex3fv (C);
glEnd ();
 
C'est juste?

 

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

Reply

Marsh Posté le 23-03-2001 à 18:34:57   

Reply

Marsh Posté le 23-03-2001 à 18:38:53    

yep.
tu peux même te dispenser de normaliser les normales en activant la normalisation par OpenGL qui ne vient à aucun coût supplémentaire depuis la GeForce.
Tu n'est pas obligé de rappeler 3 fois glNormal3f car à l'appel de glVertex, OpenGL retourne checher le dernier appel à toutes les choses du genre glNormal, glColor... Donc si tu ne changes pas, y'a pas besoin de rappeler les fonctions

Reply

Marsh Posté le 23-03-2001 à 18:44:02    

Ce que tu as calculé c'est la normale au triangle et non aux vertices.
La normale d'un vertex s'obtient en faisant la moyenne des normales des triangles auxquels il appartient (sans oublier de renormer un coup après).
En pratique les normales aux faces ne servent pas à grand chose, sauf si tu veux faire de l'éclairage flat...

Reply

Marsh Posté le 23-03-2001 à 18:48:17    

Donc ce que j'ai calculé ne sert à rien en OpenGL? Faut obligatoirement que je fasse la moyenne de toutes les normales des faces auquel le sommet appartient?

Reply

Marsh Posté le 23-03-2001 à 18:58:50    

Tu ne peux pas exporter les normales aux vertices directement depuis le soft de modélisation que t'utilises ?

Reply

Marsh Posté le 23-03-2001 à 19:03:37    

Ben je me prépare un loader de fichier 3ds, et j'ai pas vu de traces d'une liste des normales dans la doc que j'ai à propos des fichiers 3ds. Donc je sais pas si je peux les avoir.

Reply

Marsh Posté le 23-03-2001 à 19:06:56    

dans ce cas, il te suffit de calculer les normales au vertex à partir des normales aux face au moment ou tu load ton fichier 3ds.

Reply

Marsh Posté le 23-03-2001 à 19:12:04    

Prenons un exemple, un sommet qui appartient à deux faces:
 
( x, y , z ) la normale de la face 1
( x', y', z' ) la normale de la face 2
 
Pour avoir la normal du sommet on fait ( ( x + x' )/2 , ( y + y' )/2 , ( z + z' )/2), c'est bien ça?

Reply

Marsh Posté le 23-03-2001 à 19:17:35    

oui c'est ca ou tu peux aussi faire
 x"=x+x'
 y"=y+y'
 z"=z+z'
 
et ensuite tu normalises la normale (x",y",z" )
 
pour pitounet : coucou, ecoute le message sur ton portable

Reply

Marsh Posté le 23-03-2001 à 19:18:12    

Pour chaque vertex tu définis un vecteur initialisé à vecteur nul.
Tu parcours tes triangles en calculant pour chacun la normale (pas la peine de la normer si tu ne la gardes pas), et pour chaque vertex de ce triangle tu ajoutes à sa normale ce que tu viens de calculer.
Après tu parcours la liste des vertices pour normer chaque vecteur normal.

 

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

Reply

Marsh Posté le 23-03-2001 à 19:18:12   

Reply

Marsh Posté le 23-03-2001 à 19:24:44    

Ca a l'air ok, mais mieux vaut normaliser les normales de faces avant de les ajouter, sinon les triangles plus grands auront plus de poids dans la détermination de la normale. La complexité est linéaire pas rapport au nombre de triangles, donc ça ira vite de toute manière

Reply

Marsh Posté le 23-03-2001 à 19:27:38    

comme le dis si bien pitounet, tu calcules la normale de chaque face. Et ensuite à partir de la tu determines celle des points.
 
il te faut trois tableaux, si les faces sont des triangles :
 
np[nb_points][3]; // normales au point
nf[nb_faces][3]; // normales des faces
pf[nb_faces][3]; // liste des points de chaque face
 
exemple :
 pf[0][0]=2;
 pf[0][1]=23;
 pf[0][2]=0;
  => en gros la face 0 est constituée des points 2,23 et 0
 
calculs de la normale de chaque face avec eventuellement normalisation et met le resultat dans nf[i][0..2]
mise a zero de la normale de chaque point np[i][0..2]
pour i=0;i<nb_faces;i++
  ajouter la normale de la face i à celle du point A  
    => np[np[i][0]][0..2]=np[np[i][0]][0..2]+nf[np[i][0]][0..2]
  ajouter la normale de la face i à celle du point B
    => np[np[i][1]][0..2]=np[np[i][1]][0..2]+nf[np[i][1]][0..2]
  ajouter la normale de la face i à celle du point C
    => np[np[i][2]][0..2]=np[np[i][2]][0..2]+nf[np[i][2]][0..2]
fin pour
et finallement normaliser la normale de chaque point
  => normalise(np[i][0..2])
 
voila c'est peut etre pas clair mais ca marche
voila c'est pas dur

Reply

Marsh Posté le 23-03-2001 à 19:29:55    

je crois que avec toutes ces reponses tu devrais y arriver !!!

Reply

Sujets relatifs:

Leave a Replay

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