diff -r e9bb83c2b8b9 -r ffe83ca074f3 demos/bunny.py --- a/demos/bunny.py Fri Dec 07 16:39:42 2007 +0100 +++ b/demos/bunny.py Sat Dec 08 12:37:45 2007 +0100 @@ -6,11 +6,13 @@ import sys sys.path.append(open('ModulePath').read().strip()) -from raytracer import Raytracer, Light, Sphere, Triangle, Material +from raytracer import Raytracer, Light, Sphere, Triangle, NormalVertex, Material import Image def LoadStanfordPlyFile(rt, mat, filename, scale): vertices = [] + normals = [] + vertex_face_num = [] fp = file(filename) # read header tokens = (0,) @@ -23,27 +25,45 @@ face_num = int(tokens[2]) # read vertices - while (vertex_num): + num = vertex_num + while (num): tokens = fp.readline().split() v = [scale*float(x) for x in tokens[0:3]] v[0] = -v[0]-1 v[1] = v[1]-3 - vertices.append(tuple(v)) - vertex_num -= 1 + 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] - f = [vertices[int(x)] for x in tokens[1:4]] - face = Triangle(f[0], f[2], f[1], mat) + 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 + 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 + rt = Raytracer() mat = Material(colour=(0.9, 0.9, 0.9)) -LoadStanfordPlyFile(rt, mat, "../models/bunny/bun_zipper_res3.ply", 29.0) +LoadStanfordPlyFile(rt, mat, "../models/bunny/bun_zipper.ply", 29.0) light = Light(position=(-5.0, 2.0, 10.0), colour=(0.9, 0.3, 0.6)) rt.addlight(light)