[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [pygame] Perspective Test
My version.
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()