I'm posting this here, in another thread because someone said it might come up in searches better. Enjoy! Ian
import pygame from pygame.locals import * import sys, os from math import * if sys.platform == 'win32' or sys.platform == 'win64': os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init()
Screen = (800,600) pygame.display.set_caption("Perspective") Surface = pygame.display.set_mode(Screen) CameraPos = [Screen[0]/2,Screen[1]/2,-2000] Objects = [] class Object: def __init__(self,center,vertexes,vertextype,color): self.center = center self.polygon_number = vertextype self.polygons = [] polygon = [] vertexnumber = 1 for v in vertexes: polygon.append(v) if vertexnumber == self.polygon_number: self.polygons.append(polygon) polygon = [] vertexnumber = 1 continue vertexnumber += 1 self.draw_polygons = self.polygons self.color = color self.rotations = 0 def update(self): self.rotations = 0 def rotate(self,rotation,axis): Theta = radians(rotation) if self.rotations == 0: polygons = self.polygons else: polygons = self.draw_polygons self.draw_polygons = [] if axis == "x-axis": for p in polygons: polygon = [] for v in p: x = v[0] y = sin(Theta) * v[1] + cos(Theta) * v[2] z = cos(Theta) * v[1] - sin(Theta) * v[2] polygon.append([x,y,z]) self.draw_polygons.append(polygon) elif axis == "y-axis": for p in polygons: polygon = [] for v in p: x = cos(Theta) * v[0] - sin(Theta) * v[2] y = v[1] z = sin(Theta) * v[0] + cos(Theta) * v[2] polygon.append([x,y,z]) self.draw_polygons.append(polygon) elif axis == "z-axis": for p in polygons: polygon = [] for v in p: x = cos(Theta) * v[0] - sin(Theta) * v[1] y = sin(Theta) * v[0] + cos(Theta) * v[1] z = v[2] polygon.append([x,y,z]) self.draw_polygons.append(polygon) self.rotations += 1 def Cube(size,pos): ltf = (-1*size, 1*size, 1*size) ltb = (-1*size, 1*size,-1*size) rtf = ( 1*size, 1*size, 1*size) rtb = ( 1*size, 1*size,-1*size) lbf = (-1*size,-1*size, 1*size) lbb = (-1*size,-1*size,-1*size) rbf = ( 1*size,-1*size, 1*size) rbb = ( 1*size,-1*size,-1*size) faces = [ltf,ltb,rtb,rtf,#top lbf,lbb,rbb,rbf,#bottom ltf,ltb,lbb,lbf,#left rtf,rtb,rbb,rbf,#right ltf,rtf,rbf,lbf,#front ltb,rtb,rbb,lbb#back ] Objects.append(Object(pos,faces,4,(255,255,255))) Cube(100,(400,300,1000)) def GetPoints(polygon,center): points = [] for vertex in polygon: zdiff = vertex[2] + center[2] - CameraPos[2] ydiff = vertex[1] + center[1] - CameraPos[1] xdiff = vertex[0] + center[0] - CameraPos[0] PercentBack = float(-CameraPos[2])/float(-CameraPos[2]+vertex[2]) y = (Screen[1]/2) + (PercentBack*ydiff) x = (Screen[0]/2) + (PercentBack*xdiff) points.append((x,Screen[1]-y)) return points def GetInput(): key = pygame.key.get_pressed() for event in pygame.event.get(): if event.type == QUIT or key[K_ESCAPE]: pygame.quit(); sys.exit() rotate = 0 def Update(): global rotate rotate += 0.1 for o in Objects: o.update() o.rotate(rotate,"x-axis") o.rotate(rotate,"y-axis") o.rotate(rotate,"z-axis") def Draw(): Surface.fill((0,0,0)) for o in Objects: center = o.center for p in o.draw_polygons: points = GetPoints(p,center) pygame.draw.aalines(Surface,o.color,True,points,1) ## pygame.draw.polygon(Surface,o.color,points,0) pygame.display.flip() def main(): while True: GetInput() Update() Draw() if __name__ == '__main__': main()