2009-11-27 3 views
-1

J'ai besoin d'un extrait de code C# calculant les normales de surface et de vertex. Type de surface est triangulaire 3D maillé fermé. L'extrait de code requis doit pouvoir utiliser un ensemble de sommets et des triangles. Ceux-ci sont prêts à utiliser pour le moment. La surface de l'objet maillé 3D n'est pas lisse, elle doit donc être lissée.Extrait de code C# calcul des normales de surface et de vertex

Pourriez-vous m'aider.

+1

Soyez plus précis. Quelles sont vos entrées? Est-ce pour un polyèdre? Comment sont-ils définis? – jason

+0

De quel type de surface s'agit-il? Maille triangulée? La grille? Formule? Pouvez-vous poster un code de ce que vous avez jusqu'ici? –

+0

Veuillez revenir en arrière et ajouter vos clarifications à votre question initiale afin que tout le monde puisse facilement les voir. – bobbymcr

Répondre

5

Il semble que vous essayez d'afficher votre maillage 3D et d'appliquer une apparence d'ombrage lisse en interpolant les normales de surface, comme dans Phong shading, et vous devez d'abord calculer les normales. Ceci est différent de lisser la surface du maillage lui-même, car cela implique d'altérer les positions de ses sommets.

Les normales de surface peuvent être calculées par getting the vector cross product de deux arêtes d'un triangle.

En ce qui concerne le code, je ne connais aucun exemple C#, mais en C++, il devrait être facile à mettre en communication. Il est tiré de la NeHe tutorials for OpenGL populaire:

void calcNormal(float v[3][3], float out[3])    // Calculates Normal For A Quad Using 3 Points 
{ 
    float v1[3],v2[3];      // Vector 1 (x,y,z) & Vector 2 (x,y,z) 
    static const int x = 0;      // Define X Coord 
    static const int y = 1;      // Define Y Coord 
    static const int z = 2;      // Define Z Coord 

    // Finds The Vector Between 2 Points By Subtracting 
    // The x,y,z Coordinates From One Point To Another. 

    // Calculate The Vector From Point 1 To Point 0 
    v1[x] = v[0][x] - v[1][x];     // Vector 1.x=Vertex[0].x-Vertex[1].x 
    v1[y] = v[0][y] - v[1][y];     // Vector 1.y=Vertex[0].y-Vertex[1].y 
    v1[z] = v[0][z] - v[1][z];     // Vector 1.z=Vertex[0].y-Vertex[1].z 
    // Calculate The Vector From Point 2 To Point 1 
    v2[x] = v[1][x] - v[2][x];     // Vector 2.x=Vertex[0].x-Vertex[1].x 
    v2[y] = v[1][y] - v[2][y];     // Vector 2.y=Vertex[0].y-Vertex[1].y 
    v2[z] = v[1][z] - v[2][z];     // Vector 2.z=Vertex[0].z-Vertex[1].z 
    // Compute The Cross Product To Give Us A Surface Normal 
    out[x] = v1[y]*v2[z] - v1[z]*v2[y];    // Cross Product For Y - Z 
    out[y] = v1[z]*v2[x] - v1[x]*v2[z];    // Cross Product For X - Z 
    out[z] = v1[x]*v2[y] - v1[y]*v2[x];    // Cross Product For X - Y 

    ReduceToUnit(out);      // Normalize The Vectors 
} 

La fonction de normalisation ReduceToUnit() can be found there ainsi. Notez que cela calcule une surface normale pour un seul triangle. Puisque vous ne donnez aucune information sur la façon dont vos sommets et index sont stockés, je vous laisse le soin de dériver l'ensemble de triangles que vous devez passer à cette fonction.

EDIT: Comme note supplémentaire, je pense que la "direction d'enroulement" de vos triangles est significative. Enrouler dans la mauvaise direction amènera la normale à pointer aussi dans la direction opposée.