29
+ − 1
from raytracer import Triangle, NormalVertex
+ − 2
+ − 3
def LoadStanfordPlyFile(rt, filename, mat, smooth, scale=(1,1,1), trans=(0,0,0)):
+ − 4
if (type(scale) == float or type(scale) == int):
+ − 5
scale = (scale,)*3
+ − 6
vertices = []
+ − 7
normals = []
+ − 8
vertex_face_num = []
+ − 9
fp = file(filename)
+ − 10
# read header
+ − 11
tokens = (0,)
+ − 12
while (tokens[0] != "end_header"):
+ − 13
tokens = fp.readline().split()
+ − 14
if (tokens[0] == "element"):
+ − 15
if (tokens[1] == "vertex"):
+ − 16
vertex_num = int(tokens[2])
+ − 17
if (tokens[1] == "face"):
+ − 18
face_num = int(tokens[2])
+ − 19
+ − 20
# read vertices
+ − 21
num = vertex_num
+ − 22
while (num):
+ − 23
tokens = fp.readline().split()
+ − 24
v = [float(x) for x in tokens[0:3]]
+ − 25
v[0] = scale[0]*v[0] + trans[0]
+ − 26
v[1] = scale[1]*v[1] + trans[1]
+ − 27
v[2] = scale[2]*v[2] + trans[2]
+ − 28
vertices.append(NormalVertex(tuple(v)))
+ − 29
normals.append([0.,0.,0.])
+ − 30
vertex_face_num.append(0)
+ − 31
num -= 1
+ − 32
+ − 33
# read faces
+ − 34
while (face_num):
+ − 35
tokens = fp.readline().split()
+ − 36
if (tokens[0] != "3"):
+ − 37
print "ply warning: faces of %d vertices not supported" % tokens[0]
+ − 38
v = [vertices[int(x)] for x in tokens[1:4]]
+ − 39
face = Triangle(v[0], v[2], v[1], mat)
+ − 40
n = face.getNormal()
+ − 41
for x in tokens[1:4]:
+ − 42
for i in range(3):
+ − 43
normals[int(x)][i] += n[i]
+ − 44
vertex_face_num[int(x)] += 1
+ − 45
if (smooth):
+ − 46
face.setSmooth()
+ − 47
rt.addshape(face)
+ − 48
face_num -= 1
+ − 49
+ − 50
# interpolate normals at vertices
+ − 51
num = 0
+ − 52
while (num < vertex_num):
+ − 53
if (vertex_face_num[num] > 0):
+ − 54
for i in range(3):
+ − 55
normals[num][i] /= vertex_face_num[num]
+ − 56
vertices[num].setNormal(tuple(normals[num]))
+ − 57
num += 1