javascript - Convertir normales de vértices a normales de caras
Tengo un poliedro triangulado (no necesariamente convexo) y la siguiente información:
Una lista de la posición de cada vértice. Una lista de los tríos de vértices que definen cada cara. Una lista de las normales de los vértices (Aquí las normales de los vértices son vectores de cada vértice que se calculan promediando las normales de las caras (ver más abajo) alrededor de cada vértice).
Me gustaría calcular la lista de normales de las caras (los vectores normalizados perpendiculares al plano de cada cara, apuntando hacia afuera).
Respuesta #1
Simplemente puedes determinar la orientación de la normal cruzada al dotarla con una de las normales de los vértices o con el promedio de los 3 vértices.
Aquí está el pseudocódigo:
Vec3 CalcNormalOfFace( Vec3 pPositions[3], Vec3 pNormals[3] )
{
Vec3 p0 = pPositions[1] - pPositions[0];
Vec3 p1 = pPositions[2] - pPositions[0];
Vec3 faceNormal = crossProduct( p0, p1 );
Vec3 vertexNormal = pNormals[0]; // or you can average 3 normals.
float dot = dotProduct( faceNormal, vertexNormal );
return ( dot < 0.0f ) ? -faceNormal : faceNormal;
}
Respuesta #2
Código nativo de three.js para hacer esto con tres vértices a, b y c:
Puedes obtener a, b y c de tu THREE.Face3 y los vértices de la geometría:
var a = geometry.vertices[ face.a ];
var b = geometry.vertices[ face.b ];
var c = geometry.vertices[ face.c ];
y luego haces:
var normal = new THREE.Vector3().crossVectors(
new THREE.Vector3().subVectors( b, a ),
new THREE.Vector3().subVectors( c, a )
).normalize();
Pero también hay métodos de conveniencia en la clase THREE.Geometry para hacer cálculos de vértices y caras por ti: computeVertexNormals y computeFaceNormals.
