Calcul de normal par vertice
Bonjour à tous,
je suis nouveau sur ce forum et je découvre pas mal d'information, j'ai un petit probème à vous soumettre.
J'importe un objet au format WAVEFront OBJ, je calcule moi même les normales de chaque triangle, et à partir de ça j'essaie de récupérer les normales pour chaques vertices.
A l'affichage il semblerait que ça se passe mal.
[img=http://img369.imageshack.us/img369/2921/bugcalculnormal0hz.th.jpg]
Je vous soumets un peu de code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
void Objet3D::initPointNorm()
{
// le triangle a traité
for(int iT=0;iT<nbTri;++iT)
{
// les points du triangles à traiter
for(int kP = 0; kP<3; ++kP)
{
float cp = 0.;
// initialisation avant de sommer (par précaution)
tri_[iT].setNormPoint(kP, Vector3D(0.,0.,0.) );
// on parcours les autres triangles
for(int jT=0; jT<nbTri; ++jT)
{
// les points du triangle comparé
for(int lP=0; lP<3; ++lP)
{
// si le point est dans le triangle comparé
if(tri_[jT].cherchPoint(tri_[iT].getPoint(kP),lP))
{
cp ++;
// on somme la norme
tri_[iT].setNormPoint(kP, tri_[iT].getNormPoint(kP) + tri_[jT].getNorm() );
}
}
}
if(cp > 0) // on a trouver des normales
{
// on divise la norme par le nombre de point (cp)
//cp = 1 / cp;
//tri_[iT].setNormPoint(kP, tri_[iT].getNormPoint(kP) * cp );
tri_[iT].setNormPoint(kP, tri_[iT].getNormPoint(kP).Normalise());
}
}
}
smooth = true;
}
...
void Objet3D::drawSolid() const
{
// Activation de la texture
glBindTexture(GL_TEXTURE_2D, texID);
for( int i = 0 ; i<nbTri; ++i)
{
if(smooth)
{
glBegin (GL_TRIANGLES);
glNormal3f(tri_[i].getNormPoint(0).xyz(0),tri_[i].getNormPoint(0).xyz(1),tri_[i].getNormPoint(0).xyz(2));
glVertex3f(tri_[i].getPoint(0).xyz(0),tri_[i].getPoint(0).xyz(1),tri_[i].getPoint(0).xyz(2));
glNormal3f(tri_[i].getNormPoint(0).xyz(1),tri_[i].getNormPoint(1).xyz(1),tri_[i].getNormPoint(1).xyz(2));
glVertex3f(tri_[i].getPoint(1).xyz(0),tri_[i].getPoint(1).xyz(1),tri_[i].getPoint(1).xyz(2));
glNormal3f(tri_[i].getNormPoint(0).xyz(2),tri_[i].getNormPoint(2).xyz(1),tri_[i].getNormPoint(2).xyz(2));
glVertex3f(tri_[i].getPoint(2).xyz(0),tri_[i].getPoint(2).xyz(1),tri_[i].getPoint(2).xyz(2));
glEnd();
}
else
{
....
} |
En gros j'utilise la méthode expliquée quelque part sur flipcode.com, je somme les normales des triangles auquel appartient le sommet, puis soit je divise soit je normalise, ça revient au même.
Voilà j'aimerais savoir comment régler le problème, pour une certaine orientation de la caméra ça a l'aire de fonctionner.
Merci d'avance :) !