2010-11-30 14 views

Répondre

4

Moyenne des normales pour toutes les faces partageant le sommet. C'est-à-dire, il suffit d'ajouter toutes les normales de face adjacentes et de normaliser le résultat.

+0

Ce n'est pas équivalent, vous devez normaliser au lieu de la division. ([0,1] + [1,0])/2 = [0,5, 0,5], ce qui n'est pas normalisé. – msell

+0

@msell: oups, vous avez raison. – sje397

1

Voir exemple "Computing normals to achieve flat and smooth shading" (méthode ComputeVerticeNormal):

// Average all adjacent faces normals to get the vertex normal 
GLpoint pn; 
pn.x = pn.y = pn.z = 0; 
for (int jx = 0; jx < nbAdjFaces; jx++) 
{ 
    int ixFace= m_pStorage[jx]; 
    pn.x += m_pFaceNormals[ixFace].x; 
    pn.y += m_pFaceNormals[ixFace].y; 
    pn.z += m_pFaceNormals[ixFace].z; 
} 
pn.x /= nbAdjFaces; 
pn.y /= nbAdjFaces; 
pn.z /= nbAdjFaces; 

// Normalize the vertex normal 
VectorNormalize(&pn, &m_pVertNormals[ixVertice]); 
2

Certains fichiers OBJ ne pas Normales du tout. Vous devez d'abord calculer Normales par face:

donné un visage composé de 3 sommets v1, v2, v3, vous pouvez calculer la normale: La normale est le produit croisé normalisé entre v1 - v2 et v1 - v3

N = Normalize((v1 - v2) x (v1 - v3)) 

Normalize(V) = V/length(V) 

length(V) = SQRT (V.x * V.x + V.y * V.y + V.z * V.z) 

Le produit croisé:

v × u = (v.y * u.z − v.z * u.y, v.z * u.x − v.x * u.z, v.x * u.y − v.y * u.x). 

Après cela, vous pouvez calculer les Normales « lisses » en faisant la moyenne de toutes les faces adjacentes des Normales.

0

« pour mo yenne les Normales tous les visages qui partagent le sommet.

C'est, il suffit d'ajouter tous les Normales face adjacentes et normalisent le résultat. »

J'ai essayé cela et parfois vous obtenez des résultats étranges quand au moins deux des normales ont tendance à avoir un angle de 180.

Je pense est préférable d'utiliser médiatrices:

Vous avez 3 vecteurs normaux: bissectrice trouver au vecteur 2 et 3, puis trouver bissectrice au vecteur 1 et l'autre bissectrice. PUIS normaliser le résultat.