Jusqu'à présent , je calculais la normale de chaque triangle composant mon objet 3D.
Et j'affectais cette normale à chaque vertex composant le triangle.
Comme un vertex peut appartenir à plusieurs triangles , pour finir je faisais la moyenne des normales pour chaque vertex.
Je n'étais pas entièrement satisfait du résultat obtenu , alors j'ai fait une petite recherche , et je suis tombé
là dessus (http://www.cppfrance.com/codes/CALCUL-DES-NORMALES-D-UN-OBJET-3D/29723.aspx)
la méthode de KeniiyK semble intéressante , avant de me lancer là dedans, j'aimerais faire le point sur les méthodes que vous utilisez , je cherche bien sûr la plus simple , la plus efficace, la plus rapide, bref la meilleure :)
je recopie ici la méthode KeniiyK
Sinon une méthode qui marche bien (voire super bien...) pour le calcul des normales aux sommets c'est de pondérer la moyenne des normales aux faces par l'angle associé au sommet dans la face.
C'est pas clair ?, JE M'EXPLIQUE !!!!! :
(t'inquiètes pas c'est pas long et l'exemple est simple, prends une feuille et un crayon au cas mes explications ne soient pas assez claires).
En tenant compte qu'on est dans un repère direct orthonormé oxyz.
Notons 6 sommets Vi, i c [0..5] :
V0=(0.0,0.0,0.0)
V1=(1.0,0.0,0.0)
V2=(1.0,0.0,1.0)
V3=(0.0,1.0,1.0)
V4=(0.0,0.0,1.0)
V5=(0.0,1.0,0.0)
Notons 5 faces triangulaires (en CCW)
Fj(Vi0,Vi1,Vi2), j c [0..4].
Vik, k c [0..2] un des sommets précedents.
et leurs normales NFj(X,Y,Z).
F0(0,1,2) -> NF0(0.0,-1.0,0.0)
F1(0,2,4) -> NF1(0.0,-1.0,0.0)
F2(0,5,1) -> NF2(0.0,0.0,-1.0)
F3(0,3,5) -> NF3(-1.0,0.0,0.0)
F4(0,4,3) -> NF4(-1.0,0.0,0.0)
Dans le plan oxz on a :
z
|
V4......................V2
| . . NF0 et NF1 pointent vers
| . . toi.
| F1 . .
| . .
| . F0 .
V0------------------V1--x
o
Dans le plan oxy on a :
y
|
V5 .
| . NF2 pointe vers l'ecran
| .
| F2 .
| .
| .
V0------------------V1--x
o
Dans le plan oyz on a :
z
|
V4......................V3
| . . NF3 et NF4 pointent vers
| . . l'ecran.
| F4 . .
| . .
| . F3 .
V0------------------V5--y
o
Calculons maintenant la normale au sommet V0 (qui participe à toutes les faces), si tu visualises bien l'exemple, tu seras d'accord pour dire que la normale a trouvé est NV0=(-1.0,-1.0,-1.0).
Par la moyenne des faces on trouve donc :
NV0=(NF0+NF1+NF2+NF3+NF4)/5=(-2/5,-2/5,-1/5).
Donc ca ne marche pas....
Par la méthode que j'explique (que je tente d'expliquer...)
Notons les angles du sommet V0 dans chaque face Fi
par AV0i l'angle dans la face i
(par exemple AV00 =angle entre V0V1 et V0V2).
AV00=PI/4
AV01=PI/4
AV02=PI/2
AV03=PI/4
AV04=PI/4
avec une moyenne des normales aux faces pondérées par ces angles on a
NV0=NF0*AV00+NF1*AV01+NF2*AV02+NF3*AV03+NF4*AV04=(-2.0*PI/4 , -1.0*PI/2 , -2.0*PI/4)=
(-1.0,-1.0,-1.0) apres normalisation.
Histoire d'être sur de ne pas laisser des trucs en suspend :
Pour calculer les angles :
pour AV00 par exemple, tu prends les vecteurs V0V1 et V0V2 normalisés puis acos(V0V1.V0V2) . étant le Dot Product. Sachant aussi qu'en C/C++, les fonctions trigos cos, sin, acos etc... bossent en radians.
Et pour finir, saches qu'au niveau mathématique, la moyenne "de base" (non pondérée) à un "coefficient de robustesse" de 0.5 c'est à dire qu'elle peut aussi bien donner le bon résultat qu'un mauvais résultat.
J'espère que j'ai été clair et que cela puisse t'aider.
@+, KeniiyK.
Vous en pensez quoi de cette méthode ?
ffomnislas
11/09/2005, 16h37
Personnelement je fait comme toi. Je calcul les normales de chaque triangles puis celle des points.
Il ne faut pas oublier que les normales des triangles peuvent être utile dans certain cas, comme par exemple pour savoir si la face est visible depuis la caméra.
je viens de lire un autre article qui parle aussi de cette méthode de pondération avec les angles , mais sans la décrire comme le fait KeniiyK.
ça va compliquer un peu plus , mais si ça permet d'obtenir de meilleurs résultats , je crois que ça vaut le coup d'essayer .
Dès que j'ai un peu de temps , je m'y colle .
je crois qu'il faut ajouter que le calcul des normales vertex/face et ce en tenant compte des aretes est important effectivement puisque techniquement il est utilise un peu partout (collisions, visibilité, etc) mais en fait un artiste qui modelise un truc a envie de voir ce qu'il a fait dans le moteur. Donc il doit avoir dans une moindre mesure le moyen d'agir sur les normales, comme les smoothing groups...
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org