look-around.py
look-around.py — text/python-source, 2 KB (2480 bytes)
Dateiinhalt
from __future__ import division from visual.text import * # Bruce Sherwood, December 2007 print """ With left mouse button down, move left or right to look around. """ s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' c = len(s) R = 5 for n in range(c): theta = n*2*pi/c-pi/2 text(pos=(R*cos(theta), 0, R*sin(theta)), axis=(-sin(theta), 0, cos(theta)), string=s[n], height = 1, depth=0.5, color=color.yellow) camera = vector(0,0,0) # for generality; need not be at origin # Place center of scene at a distance R from the camera: scene.center = camera+vector(0,0,-R) # Point the camera: scene.forward = scene.center-camera # scene.fov is "field of view" in radians. R times the tangent # of half the field of view is half of the width of the scene: scene.range = R*tan(scene.fov/2) scene.userspin = False down = False lastpos = None while 1: rate(100) if scene.mouse.events: m = scene.mouse.getevent() if m.press == 'left': down = True elif m.release == 'left': down = False if down: # and scene.mouse.pos != lastpos: lastpos = scene.mouse.pos lastpos.y = 0 # force mouse position to have y=0 # (lastpos-camera) is a vector parallel to screen. # (lastpos-camera) cross norm(forward) is a vector in the +y direction, # and this y component of the cross product is proportional to # how far to the right the mouse is (if mouse is to left, this y # component is negative) rotation = cross((lastpos-camera),norm(scene.forward)) # If the mouse is to the right, y component is positive, and we need to # turn the view toward the right, which means rotating the forward # vector toward the right, about the +y axis, which requires a # negative angle (vice versa if mouse is to the left, in which case # the cross product is in the -y direction. The factor of 1/100 was # chosen experimentally as giving an appropriate sensitivity to how # far to the right (or left) the mouse is. Bigger mouse displacement # makes the rotation faster. scene.forward = scene.forward.rotate(angle=-rotation.y/100, axis=(0,1,0)) # Move the center of the scene to be a distance R from the camera, # in the direction of forward. scene.center = camera+R*norm(scene.forward)