def mousecamTask(self, task): """Rotate camera when the pointer moves to the edges of the screen. Also temporarily zooms in past an obstructing CameraM'ed object.""" self.setDist(self.zoomLvl) #preset dist to current zoom level. if self.Q.getNumEntries() > 0: #if there was a collision self.Q.sortEntries() #so we get the closest collision to avatar point = self.Q.getEntry(0).getSurfacePoint( self.target) #get the point if point.lengthSquared() < camera.getPos().lengthSquared( ): #not out. self.setDist(point.length()) #Temporarily zoom to point. camera.lookAt(self.target) # always point camera at target if not base.mouseWatcherNode.hasMouse( ): #See if the mouse is available. return Task.cont #if no, just loop again. # Get the relative mouse position, its always between 1 and -1 mpos = base.mouseWatcherNode.getMouse() if mpos.getX() > 0.99: self.rotateCam(P.Point2(-10, 0)) elif mpos.getX() < -0.99: self.rotateCam(P.Point2(10, 0)) if mpos.getY() > 0.9: self.rotateCam(P.Point2(0, -3)) elif mpos.getY() < -0.9: self.rotateCam(P.Point2(0, 3)) return Task.cont #loop again.
def __init__(self, avatar, offset=P.Point3.zero(), dist=10, rot=20, zoom=(30, 400), pitch=(-15, 0)): # Disable default camera interface. base.disableMouse() # Set parameters self.zoomLvl = dist #camera starting distance self.speed = 1.0 / rot # Controls speed of camera rotation. self.zoomClamp = zoom #clamp zoom in this range self.clampP = pitch #clamp pitch in this range self.target = avatar.attachNewNode('camera target') self.target.setPos(offset) #offset target from avatar. #Load the camera self.__loadCamera() #Enable new camera interface self.accept('arrow_up', self.cameraZoom, [0.7]) #Translated. For zooming. self.accept('arrow_down', self.cameraZoom, [1.3]) self.accept('arrow_left', self.rotateCam, [P.Point2(-10, 0)]) self.accept('arrow_right', self.rotateCam, [P.Point2(10, 0)]) taskMgr.add(self.mousecamTask, "mousecamTask") #For edge screen tracking
def __loadCamera(self): """Only seperate for organisation, treat it as is part of __init__() . Load the camera & setup segmet & queue for detecting obstructions.""" #Don't rotate the target with the avatar. self.target.node().setEffect(P.CompassEffect.make(render)) camera.reparentTo(self.target) # Attach the camera to target. camera.setPos(0, -self.zoomLvl, 50) # Position the camera self.rotateCam(P.Point2(0, 0)) # Initialize gimbal clamps. self.Q = P.CollisionHandlerQueue() # New queue for camera. self.segment = fromCol( self.target, self.Q, P.CollisionSegment(P.Point3.zero(), camera.getPos(self.target)), P.BitMask32( CameraM)) #CameraM into segment between camera & target.
def Str2Point2(string): buffer = string.split(' ') return pm.Point2(*[float(buffer[i]) for i in range(2)])