def dyna(self,x,y): """Perform dynamic zoom/pan/rotation functions""" w,h = self.width(),self.height() if self.dynamic == "trirotate": # set all three rotations from mouse movement # tangential movement sets twist, # but only if initial vector is big enough x0 = self.state # initial vector d = vector.length(x0) if d > h/8: x1 = [x-w/2, h/2-y, 0] # new vector a0 = math.atan2(x0[0],x0[1]) a1 = math.atan2(x1[0],x1[1]) an = (a1-a0) / math.pi * 180 ds = utils.stuur(d,[-h/4,h/8,h/4],[-1,0,1],2) twist = - an*ds #print "an,d,ds = ",an,d,ds,twist self.camera.rotate(twist,0.,0.,1.) self.state = x1 # radial movement rotates around vector in lens plane x0 = [self.statex-w/2, h/2-self.statey, 0] # initial vector dx = [x-self.statex, self.statey-y,0] # movement b = vector.projection(dx,x0) #print "x0,dx,b=",x0,dx,b if abs(b) > 5: val = utils.stuur(b,[-2*h,0,2*h],[-180,0,+180],1) rot = [ abs(val),-dx[1],dx[0],0 ] #print "val,rot=",val,rot self.camera.rotate(*rot) self.statex,self.statey = (x,y) elif self.dynamic == "pan": dist = self.camera.getDist() * 0.5 # hor movement sets x value of center # vert movement sets y value of center #panx = utils.stuur(x,[0,self.statex,w],[-dist,0.,+dist],1.0) #pany = utils.stuur(y,[0,self.statey,h],[-dist,0.,+dist],1.0) #self.camera.setCenter (self.state[0] - panx, self.state[1] + pany, self.state[2]) dx,dy = (x-self.statex,y-self.statey) panx = utils.stuur(dx,[-w,0,w],[-dist,0.,+dist],1.0) pany = utils.stuur(dy,[-h,0,h],[-dist,0.,+dist],1.0) #print dx,dy,panx,pany self.camera.translate(panx,-pany,0) self.statex,self.statey = (x,y) elif self.dynamic == "zoom": # hor movement is lens zooming f = utils.stuur(x,[0,self.statex,w],[180,self.statef,0],1.2) self.camera.setLens(f) elif self.dynamic == "combizoom": # hor movement is lens zooming f = utils.stuur(x,[0,self.statex,w],[180,self.state[1],0],1.2) #print "Lens Zooming: %s" % f self.camera.setLens(f) # vert movement is dolly zooming d = utils.stuur(y,[0,self.statey,h],[0.2,1,5],1.2) self.camera.setDist(d*self.state[0]) self.update()
def dynarot(self,x,y,action): """Perform dynamic rotation operation. This function processes mouse button events controlling a dynamic rotation operation. The action is one of PRESS, MOVE or RELEASE. """ if action == PRESS: w,h = self.width(),self.height() self.state = [self.statex-w/2, self.statey-h/2, 0.] elif action == MOVE: w,h = self.width(),self.height() # set all three rotations from mouse movement # tangential movement sets twist, # but only if initial vector is big enough x0 = self.state # initial vector d = length(x0) if d > h/8: # GD.debug(d) x1 = [x-w/2, y-h/2, 0] # new vector a0 = atan2(x0[0],x0[1]) a1 = atan2(x1[0],x1[1]) an = (a1-a0) / pi * 180 ds = utils.stuur(d,[-h/4,h/8,h/4],[-1,0,1],2) twist = - an*ds self.camera.rotate(twist,0.,0.,1.) self.state = x1 # radial movement rotates around vector in lens plane x0 = [self.statex-w/2, self.statey-h/2, 0] # initial vector dx = [x-self.statex, y-self.statey,0] # movement b = projection(dx,x0) if abs(b) > 5: val = utils.stuur(b,[-2*h,0,2*h],[-180,0,+180],1) rot = [ abs(val),-dx[1],dx[0],0 ] self.camera.rotate(*rot) self.statex,self.statey = (x,y) self.update() elif action == RELEASE: self.update() self.camera.saveMatrix()