[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Minimalistic Pygame 3D Engine



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()