from vpython import * #GlowScript 2.7 VPython scene.width = 600 scene.height = 600 show = 'box' last_show = show D = 0.7 # size of box R = .4 # radius of sphere names = ['flower', 'granite', 'gravel', 'metal', 'rock', 'rough', 'rug', 'stones', 'stucco', 'wood', 'wood_old', 'earth'] Ts = [textures.flower, textures.granite, textures.gravel, textures.metal, textures.rock, textures.rough, textures.rug, textures.stones, textures.stucco, textures.wood, textures.wood_old, textures.earth] bumps = [ None, None, 'gravel', None, 'rock', None, None, 'stones', 'stucco', None, 'wood_old'] def erase(): for obj in scene.objects: obj.visible = False def show_object(index, x, y): T = Ts[index] B = None # Bump maps aren't very salient unless one moves the light or rotates the object, # so don't bother with bump maps unless there's an option to move the light or object. #if (bumps[index] !== None) B = bumpmaps[bumps[index]] if show == 'box': c = box(pos=vec(x,y,0), size=D*vec(1,1,1)) elif show == 'sphere': c = sphere(pos=vec(x,y,0), size=D*vec(1,1,1)) elif show == 'cylinder': c = cylinder(pos=vec(x-D/2,y,0), size=D*vec(1,1,1)) elif show == 'cone': c = cone(pos=vec(x-D/2,y,0), size=D*vec(1,1,1)) elif show == 'pyramid': c = pyramid(pos=vec(x-D/2,y,0), size=D*vec(1,1,1)) c.index = index c.shininess = 0 c.texture = {'file':T, 'bumpmap':B} label(pos=vec(x,y-.5,0), box=0, text='textures.'+names[index]) def setup(): scene.range = 2.2 scene.fov = 0.2 scene.center = vec(1.5,2,0) scene.forward = vec(0,0,-1) erase() scene.visible = False index = 0 y = 3.3 while y > 0: for x in range(4): if index >= len(names): break; show_object(index, x, y) index += 1 y -= 1.3 scene.visible = True setup() scene.visible = False scene.caption = "Loading textures..." scene.waitfor("textures") scene.caption = "Choose the type of object: " scene.visible = True def choose(c): global show show = c.selected menu(choices=['box', 'sphere', 'cylinder', 'cone', 'pyramid'], selected='box', bind=choose) scene.append_to_caption('\n\nClick an object to enlarge it; then click anywhere to show all objects again.') hit = None clicked = False def handle_click(ev): global hit, clicked hit = scene.mouse.pick clicked = True scene.bind('click', handle_click) def single_object(index): scene.center = vec(0,-.1*R,0) scene.range = 1.5*R erase() show_object(index, 0, 0) picked = None while True: rate(30) if show != last_show: last_show = show if picked != None: single_object(picked.index) else: setup() if clicked: clicked = False if picked != None: picked = None setup() elif picked == None and hit != None: picked = hit hit = None single_object(picked.index)