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()[0]:
camera.addcube(1)
if pygame.mouse.get_pressed()[2]:
camera.addcube(0)