2011-06-05 3 views
0

Je lis un fichier .obj Wavefront où les normales sont fournies. Et je souhaite calculer la tangente manuellement.Récupérer les bords du vecteur normal

Y a-t-il un moyen de récupérer le bord1 et le bord2 qui créent le vecteur normal?

Répondre

3

Si vous avez un seul vecteur normal, il y a un nombre infini de choix pour vos deux arêtes perpendiculaires - toute combinaison de vecteurs dont le produit croisé vous donne ce vecteur normal.

Vous devez contraindre votre question en décidant dans quelle direction vous voulez que vos vecteurs tangents aillent. Ce http://support.microsoft.com/kb/131130 pourrait vous aider à revenir en arrière. HTH,

+0

Oui je sais cela, mais puisque la normale est représentée comme un vecteur normalisé. Il n'y a fondamentalement qu'une seule combinaison d'arêtes qui donnera cette normale. C'est ce que j'essaie de récupérer. – McBob

0

Voir http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/ pour une introduction sur la tangente et les bitangents; ils sont également des références supplémentaires au bas de vous voulez plus de détails.

Cependant, votre question concerne la normale.

OBJ est un format indexé, avec un index pour les positions et un index (différent) pour les normales (et ainsi de suite pour tous les attributs).

Donc, si vous avez une ligne comme ceci:

f 0/10 1/11 2/12 

, vous avez un visage qui est un triangle (3 indices); les indices de position sont 0,1,2 (cela dépend de votre fichier obj, il est décrit dans l'en-tête du fichier). Pour obtenir les positions, indexer le tableau de position:

vec3 vertexPos1 = positions[0]; // or more generically, positions[faceIndices[i++]] 
vec3 vertexPos2 = positions[1]; 
vec3 vertexPos2 = positions[2]; 

egdes sont les deltas des positions:

vec3 edge1 = vertexPos2 - vertexPos1; // order is important 
vec3 edge2 = vertexPos3 - vertexPos1; 

normale est le produit croisé de ces bords:

vec3 normal = cross(edge1,edge2); // order important too 
normalize(normal); 
Questions connexes