demos/buddha.py
branchpyrit
changeset 13 fbd1d2f7d94e
child 19 4e0955fca797
equal deleted inserted replaced
12:f4fcabf05785 13:fbd1d2f7d94e
       
     1 #!/usr/bin/python
       
     2 
       
     3 # this demo needs buddha model from
       
     4 # http://graphics.stanford.edu/data/3Dscanrep/
       
     5 
       
     6 import sys
       
     7 sys.path.append("..")
       
     8 
       
     9 from raytracer import Raytracer, Light, Sphere, Triangle, Material
       
    10 import Image
       
    11 
       
    12 def LoadStanfordPlyFile(rt, mat, filename, scale):
       
    13 	vertices = []
       
    14 	fp = file(filename)
       
    15 	# read header
       
    16 	tokens = (0,)
       
    17 	while (tokens[0] != "end_header"):
       
    18 		tokens = fp.readline().split()
       
    19 		if (tokens[0] == "element"):
       
    20 			if (tokens[1] == "vertex"):
       
    21 				vertex_num = int(tokens[2])
       
    22 			if (tokens[1] == "face"):
       
    23 				face_num = int(tokens[2])
       
    24 
       
    25 	# read vertices
       
    26 	while (vertex_num):
       
    27 		tokens = fp.readline().split()
       
    28 		v = [scale*float(x) for x in tokens[0:3]]
       
    29 		v[0] = -v[0]
       
    30 		v[1] = v[1]-5
       
    31 		v[2] = -v[2]
       
    32 		vertices.append(tuple(v))
       
    33 		vertex_num -= 1
       
    34 
       
    35 	# read faces
       
    36 	while (face_num):
       
    37 		tokens = fp.readline().split()
       
    38 		if (tokens[0] != "3"):
       
    39 			print "ply warning: faces of %d vertices not supported" % tokens[0]
       
    40 		f = [vertices[int(x)] for x in tokens[1:4]]
       
    41 		face = Triangle(f[0], f[1], f[2], mat)
       
    42 		rt.addshape(face)
       
    43 		face_num -= 1
       
    44 
       
    45 rt = Raytracer()
       
    46 mat = Material(colour=(0.9, 0.9, 0.9))
       
    47 LoadStanfordPlyFile(rt, mat, "happy_vrip_res2.ply", 30.0)
       
    48 
       
    49 light = Light(position=(-5.0, 2.0, -8.0), colour=(0.9, 0.3, 0.6))
       
    50 rt.addlight(light)
       
    51 
       
    52 imagesize = (800, 600)
       
    53 data = rt.render(imagesize)
       
    54 img = Image.fromstring("RGB", imagesize, data)
       
    55 img.save('buddha.png')