Je charge un objet à partir d'un .off file. Ce format de fichier ne définit pas les normales pour les faces ou les sommets d'un objet. J'ai trouvé les normales du visage en utilisant un produit vectoriel. Mais je n'arrive pas à trouver les normales pour chaque sommet, aucune idée?Comment puis-je trouver les normales pour chaque sommet d'un objet afin que je puisse appliquer un ombrage lisse avec OpenGL?
Répondre
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.
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]);
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.
« 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.
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
@msell: oups, vous avez raison. – sje397