on m'a demandé sur le forum de poster mon algo de tri des sommets mais sorti de son contexte il ne sert pas a grand chose donc je poste ici ma fonction complete de calcul des normales d'un objet
toutes les critiques, si elles sont constructives, sont les bienvenues ;-)
Source / Exemple :
void objet::normales()
{
float tri[4000][7];
int i;
int j;
int k=0;
log("calcul des normales");
for (i=0; i<polygons_qty; i++)
{
normx[polya[i]]=(((verty[polyb[i]])-(verty[polyb[i]]))*((vertz[polyc[i]])-(vertz[polyc[i]])))-(((verty[polyb[i]])-(verty[polyb[i]]))*((vertz[
polyc[i]])-(vertz[polyc[i]])));
normy[polya[i]]=(((vertz[polyc[i]])-(vertz[polyc[i]]))*((vertx[polya[i]])-(vertx[polya[i]])))-(((vertz[polyc[i]])-(vertz[polyc[i]]))*((vertx[
polya[i]])-(vertx[polya[i]])));
normz[polya[i]]=(((vertx[polya[i]])-(vertx[polya[i]]))*((verty[polyb[i]])-(verty[polyb[i]])))-(((vertx[polya[i]])-(vertx[polya[i]]))*((verty[
polyb[i]])-(verty[polyb[i]])));
normx[polya[i]]=normx[polya[i]]/sqrt((normx[polya[i]]*normx[polya[i]])+(normy[polya[i]]*normy[polya[i]])+(normz[polya[i]]*normz[polya[i]]));
normy[polya[i]]=normy[polya[i]]/sqrt((normx[polya[i]]*normx[polya[i]])+(normy[polya[i]]*normy[polya[i]])+(normz[polya[i]]*normz[polya[i]]));
normz[polya[i]]=normz[polya[i]]/sqrt((normx[polya[i]]*normx[polya[i]])+(normy[polya[i]]*normy[polya[i]])+(normz[polya[i]]*normz[polya[i]]));
//2eme point
normx[polyb[i]]=normx[polya[i]];
normy[polyb[i]]=normy[polya[i]];
normz[polyb[i]]=normz[polya[i]];
//3eme point
normx[polyc[i]]=normx[polya[i]];
normy[polyc[i]]=normy[polya[i]];
normz[polyc[i]]=normz[polya[i]];
}
log("mise a 0 du tableau de tri");
for (i=0; i<4000; i++)
{
for (j=0; j<7; j++)
{
tri[i][j]=0;
}
}
log("tri des sommets");
for (i=0; i<vertices_qty; i++)
{
k=0;
for (j=0; j<4000; j++)
{
if (vertx[i]==tri[j][0] && verty[i]==tri[j][1] && vertz[i]==tri[j][2])
{
tri[j][3]=tri[j][3]+normx[i];
tri[j][4]=tri[j][4]+normy[i];
tri[j][5]=tri[j][5]+normz[i];
tri[j][6]=tri[j][6]+1;
k=1;
}
}
if(k==0)
for (j=0; j<4000; j++)
{
if (tri[j][3]==0 && tri[j][4]==0 && tri[j][5]==0)
{
tri[j][0]=vertx[i];
tri[j][1]=verty[i];
tri[j][2]=vertz[i];
tri[j][3]=normx[i];
tri[j][4]=normy[i];
tri[j][5]=normz[i];
break;
}
}
}
log("calcul de la moyenne");
for (j=0; j<4000; j++)
{
tri[j][3]=tri[j][3]/tri[j][6];
tri[j][4]=tri[j][4]/tri[j][6];
tri[j][5]=tri[j][5]/tri[j][6];
}
log("assignation des normales");
for (i=0; i<4000; i++)
{
for (j=0; j<vertices_qty; j++)
{
if (vertx[j]==tri[i][0] && verty[j]==tri[i][1] && vertz[j]==tri[i][2])
{
normx[j]=tri[i][3];
normy[j]=tri[i][4];
normz[j]=tri[i][5];
}
}
}
}
Conclusion :
pour la comprehension de tout le monde, quelques infos:
vous pouvez voir aparaitre ci dessous dans le code source des trucs dans ce genre la: verty[ polyb[i] ]
cela est du au fait que j'utilise comme format de fichiers pour mes objets 3d le 3ds et que donc il stock les donnes des vertices mais aussi
l'ordre des points, et ce afin de pouvoir a coup sur calculer la normal dans le bon sens ;-)
vertx verty et vertz sont les 3 coordonnes des sommets des polygones
ploya ployb et polyc sont les infos d'ordre des sommets
normx normy et normz sont les 3 elements des normals
mon tableau de tri est constitué comme cela: vertx | verty | vertz | normx | normy | normz | diviseur pour faire la moyenne (nbre de fois ou
j'ai fait un ajout dans cette ligne)
a savoir qu'ici je dispose de 4000 polygones au max
en esperant que cela en aide plus d'un ;-)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.