def computeNormals(vertices, faces):
numVertices = len(vertices)
numFaces = len(faces)
normalsPerFace = [None] * numFaces
areasPerFace = [0.0] * numFaces
normalsPerVertex = np.zeros(vertices.shape, dtype=vertices.dtype)
for i in xrange(0, numFaces):
face = faces[i]
v0 = vertices[face[0]]
v1 = vertices[face[1]]
v2 = vertices[face[2]]
ctrd = centroid(v0, v1, v2)
v1A = c3d.subtract(v1, v0)
v2A = c3d.subtract(v2, v0)
normalA = np.cross(v1A, v2A)
viewPointA = c3d.add(ctrd, normalA)
normalB = np.cross(v2A, v1A)
viewPointB = c3d.add(ctrd, normalB)
area = triangleArea(v0, v1)
areasPerFace[i] = area
squaredDistanceA = c3d.magnitudeSquared(viewPointA)
squaredDistanceB = c3d.magnitudeSquared(viewPointB)
# Always take the furthest point
if squaredDistanceA > squaredDistanceB:
normalsPerFace[i] = normalA
else:
normalsPerFace[i] = normalB
for i in xrange(0, numFaces):
face = faces[i]
weightedNormal = [c * areasPerFace[i] for c in normalsPerFace[i]]
for j in face:
normalsPerVertex[j] = c3d.add(normalsPerVertex[j], weightedNormal)
for i in xrange(0, numVertices):
normalsPerVertex[i] = c3d.normalize(normalsPerVertex[i])
return normalsPerVertex
评论列表
文章目录