diff -r ffe83ca074f3 -r 574c34441a1c demos/plyreader.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demos/plyreader.py Sat Dec 08 14:07:42 2007 +0100 @@ -0,0 +1,57 @@ +from raytracer import Triangle, NormalVertex + +def LoadStanfordPlyFile(rt, filename, mat, smooth, scale=(1,1,1), trans=(0,0,0)): + if (type(scale) == float or type(scale) == int): + scale = (scale,)*3 + vertices = [] + normals = [] + vertex_face_num = [] + fp = file(filename) + # read header + tokens = (0,) + while (tokens[0] != "end_header"): + tokens = fp.readline().split() + if (tokens[0] == "element"): + if (tokens[1] == "vertex"): + vertex_num = int(tokens[2]) + if (tokens[1] == "face"): + face_num = int(tokens[2]) + + # read vertices + num = vertex_num + while (num): + tokens = fp.readline().split() + v = [float(x) for x in tokens[0:3]] + v[0] = scale[0]*v[0] + trans[0] + v[1] = scale[1]*v[1] + trans[1] + v[2] = scale[2]*v[2] + trans[2] + vertices.append(NormalVertex(tuple(v))) + normals.append([0.,0.,0.]) + vertex_face_num.append(0) + num -= 1 + + # read faces + while (face_num): + tokens = fp.readline().split() + if (tokens[0] != "3"): + print "ply warning: faces of %d vertices not supported" % tokens[0] + v = [vertices[int(x)] for x in tokens[1:4]] + face = Triangle(v[0], v[2], v[1], mat) + n = face.getNormal() + for x in tokens[1:4]: + for i in range(3): + normals[int(x)][i] += n[i] + vertex_face_num[int(x)] += 1 + if (smooth): + face.setSmooth() + rt.addshape(face) + face_num -= 1 + + # interpolate normals at vertices + num = 0 + while (num < vertex_num): + if (vertex_face_num[num] > 0): + for i in range(3): + normals[num][i] /= vertex_face_num[num] + vertices[num].setNormal(tuple(normals[num])) + num += 1