Камера class Camera: def __init__(self,x,y,z,a,h=0): self.x = x self.y = y self.z = z self.ux = 0 self.uy = 1 self.uz = 0 self.a = a self.h = h self.update_vel() def lookat(self): glMatrixMode(GL_MODELVIEW) glLoadIdentity() gluLookAt(self.x,self.y,self.z,self.x+self.dx,self.y+self.dy,self.z+self.dz,self.ux,self.uy,self.uz)

def update_vel(self): ch = math.cos(self.h) self.dx = math.cos(self.a)*ch self.dz = math.sin(self.a)*ch self.dy = math.sin(self.h)

def steer(self,da): self.a+=da if self.a>math.pi*2: self.a -= math.pi*2 if self.a<0: self.a+= math.pi*2 self.update_vel()

def pitch(self,dh): self.h+=dh if self.h>math.pi/2.1: self.h = math.pi/2.1 if self.h<-math.pi/2.1: self.h = - math.pi/2.1 self.update_vel()

def lift(self,dy): self.y += dy

def forward(self,l): self.x+=self.dx*l self.y+=self.dy*l self.z+=self.dz*l

def drawcursor(self): if self.dy>-0.1: return t = - self.y / self.dy self.curx = self.x + t* self.dx self.curz = self.z + t* self.dz

glColor(0.5,0,0) cube(self.curx,0,self.curz,sc = 0.2)

def addcube(self,what): xx = int(self.curx) yy = int(self.curz) if (0<= xx < SX) and (0<= yy < SY): field[xx,yy] = what

def point_at_cube(self,x1,y1,z1,x2,y2,z2): if abs(self.dx)>= max(abs(self.dy),abs(self.dz)): # go throught x axis t = (x1 - self.x)/self.dx py = self.y + t*self.dy pz = self.z + t*self.dz

if (y1 < py < y2) and (z1 < pz < z2): return True

t = (x2 - self.x)/self.dx py = self.y + t*self.dy pz = self.z + t*self.dz

if (y1 < py < y2) and (z1 < pz < z2): return True return False if abs(self.dy)> max(abs(self.dx),abs(self.dz)): # go throught y axis '''s/x/temp/g s/y/x/g s/temp/y/g''' t = (y1 - self.y)/self.dy px = self.x + t*self.dx pz = self.z + t*self.dz

if (x1 < px < x2) and (z1 < pz < z2): return True

t = (y2 - self.y)/self.dy px = self.x + t*self.dx pz = self.z + t*self.dz

if (x1 < px < x2) and (z1 < pz < z2): return True return False if abs(self.dz)> max(abs(self.dy),abs(self.dx)): # go throught x axis '''s/x/temp/g s/z/x/g s/temp/z/g''' t = (z1 - self.z)/self.dz py = self.y + t*self.dy px = self.x + t*self.dx

if (y1 < py < y2) and (x1 < px < x2): return True

t = (z2 - self.z)/self.dz py = self.y + t*self.dy px = self.x + t*self.dx

if (y1 < py < y2) and (x1 < px < x2): return True return False

camera = Camera(5,15,5,0) camera.pitch(-1)

def draw (): glClear(GL_COLOR_BUFFER_BIT)

camera.lookat()

if event.type is KEYDOWN: if event.key == K_ESCAPE: sys.exit(0) if event.key == K_LEFT: camera.steer(-0.05) if event.key == K_RIGHT: camera.steer(0.05) if event.key == K_r: camera.lift(0.2) if event.key == K_f: camera.lift(-0.2) if event.key == K_w: camera.forward(0.5) if event.key == K_s: camera.forward(-0.5) if event.type is MOUSEMOTION: x,y = pygame.mouse.get_rel() camera.steer(x/300.0) camera.pitch(-y/300.0) if pygame.mouse.get_pressed(): camera.addcube(1) if pygame.mouse.get_pressed(): camera.addcube(0)