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

 


Dernière réponse
Sujet : [OpenGL] The Normals Come Back
darkoli je crois que avec toutes ces reponses tu devrais y arriver !!!

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
darkoli je crois que avec toutes ces reponses tu devrais y arriver !!!
darkoli 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
janoscoder 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
z51 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]

darkoli 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
Alload 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?
Pitounet 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.
Alload 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.
z51 Tu ne peux pas exporter les normales aux vertices directement depuis le soft de modélisation que t'utilises ?
Alload 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?
z51 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...
janoscoder 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
Alload 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]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)