[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[pygame] Minimalistic Pygame 3D Engine
- To: "pygame-users@xxxxxxxx" <pygame-users@xxxxxxxx>
- Subject: [pygame] Minimalistic Pygame 3D Engine
- From: "Ian Mallett" <geometrian@xxxxxxxxx>
- Date: Tue, 11 Mar 2008 07:01:55 -0700
- Delivered-to: archiver@xxxxxxxx
- Delivered-to: pygame-users-outgoing@xxxxxxxx
- Delivered-to: pygame-users@xxxxxxxx
- Delivery-date: Tue, 11 Mar 2008 10:02:00 -0400
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=vaY0jA38zcaeXK0QWh7vq/eQ02AAov8/oVoVxXYbbuc=; b=qFWer+zThmkNNPvdutiKIkQYLvffAWExhcL2lgRps8UBSmKulI8r6o75xFfyIo6ZGejNFO6UY0kSzy2yuInUNRoz8i2oReV4S3YK4Go6Uq7XOcRD0RKppbrDpnSuiZaQafI2vN2GJ+tD/h1bjA92IW9ApdOPP/44iVjEE4DV3eA=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=E6ritWUqU53z0Jmvb2/ppswPk8rhal6jhfGY57W+gskk5p4JT1jv5vRoAYLvGRL+twSIVZ0agxqxJcP0DB0Cx6xdxmS7VlzHzhUsznZN1zjzNDvkXa2rSWlOEGH99NMSZlEy8sSStet8CVN7ffCE2OUM2DmzrJH3QDAxKXQfqr4=
- Reply-to: pygame-users@xxxxxxxx
- Sender: owner-pygame-users@xxxxxxxx
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()