When I start my program and press "N" to create a new cube, the cube is added to a list and rendered. However, with the addition of each new cube, it seems to save the position of the previous one and create any new cube at that spot. Feeling a little frustrated. I don't see how it's
overwriting the initialized position that I give it :
objects_Render.append(
Cube_Projectile((0.0,0.0,0.0))
)
![]()
What am I doing wrong?
SCREEN_SIZE = (800, 600)
import sys
from math import radians
from OpenGL.GL import *
from OpenGL.GLU import *
import pygame
from pygame.locals import *
from gameobjects.matrix44 import *
from gameobjects.vector3 import *
import random
def resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(90.0, float(width)/height, .1, 10000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def init():
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_FLAT)
glClearColor(1.0, 1.0, 1.0, 1.0)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLight(GL_LIGHT0, GL_POSITION, (10, 10, 10, 0))
class Ground(object):
def __init__(self):
self.position= (0.0, 0.0, 0.0)
self.color = tuple([random.uniform(0.0,1.0), random.uniform(0.0,1.0) , random.uniform(0.0,1.0)])
def render(self):
glColor(self.color[0], self.color[1], self.color[2])
glTranslatef(self.position[0], self.position[1], self.position[2])
glBegin(GL_QUADS)
glNormal3f(0.000000, 1.000000, 0.000000)
glVertex3f(-2000.000000, 0.000000, -200.000000)
glVertex3f(-2000.000000, 0.000000, 200.000000)
glVertex3f(-2000.000000, 0.000000, 200.000000)
glVertex3f(-2000.000000, 0.000000, -200.000000)
glEnd()
class Cube_Projectile(object):
def __init__(self, position):
self.position = (0.0, 0.0, 0.0)
self.color = tuple([random.uniform(0.0,1.0), random.uniform(0.0,1.0) , random.uniform(0.0,1.0)])
self.life = 1000
def render(self):
if self.life > 0:
glColor(self.color)
# Adjust all the vertices so that the cube is at self.position
# vertices = [tuple(Vector3(v) + self.position) for v in self.vertices]
# Draw all 6 faces of the cube
self.life -= 1
glTranslatef(self.position[0], self.position[1], self.position[2])
glBegin(GL_QUADS)
glNormal3f(2.000000, 0.000000, 0.000000)
glVertex3f(-2.000000, -2.000000, -2.000000)
glVertex3f(-2.000000, -2.000000, 2.000000)
glVertex3f(-2.000000, 2.000000, 2.000000)
glVertex3f(-2.000000, 2.000000, -2.000000)
glNormal3f(0.000000, -0.000000, 2.000000)
glVertex3f(-2.000000, 2.000000, -2.000000)
glVertex3f(2.000000, 2.000000, -2.000000)
glVertex3f(2.000000, -2.000000, -2.000000)
glVertex3f(-2.000000, -2.000000, -2.000000)
glNormal3f(-2.000000, 0.000000, -0.000000)
glVertex3f(2.000000, 2.000000, -2.000000)
glVertex3f(2.000000, 2.000000, 2.000000)
glVertex3f(2.000000, -2.000000, 2.000000)
glVertex3f(2.000000, -2.000000, -2.000000)
glNormal3f(0.000000, -0.000000, -1.000000)
glVertex3f(-2.000000, -2.000000, 2.000000)
glVertex3f(2.000000, -2.000000, 2.000000)
glVertex3f(2.000000, 2.000000, 2.000000)
glVertex3f(-2.000000, 2.000000, 2.000000)
glNormal3f(0.000000, -1.000000, 0.000000)
glVertex3f(-2.000000, -2.000000, 2.000000)
glVertex3f(-2.000000, -2.000000, -2.000000)
glVertex3f(2.000000, -2.000000, -2.000000)
glVertex3f(2.000000, -2.000000, 2.000000)
glNormal3f(0.000000, 1.000000, 0.000000)
glVertex3f(2.000000, 2.000000, 2.000000)
glVertex3f(2.000000, 2.000000, -2.000000)
glVertex3f(-2.000000, 2.000000, -2.000000)
glVertex3f(-2.000000, 2.000000, 2.000000)
glEnd()
def run():
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE|OPENGL|DOUBLEBUF)
resize(*SCREEN_SIZE)
init()
clock = pygame.time.Clock()
glMaterial(GL_FRONT, GL_AMBIENT, (0.1, 0.1, 0.1, 1.0))
glMaterial(GL_FRONT, GL_DIFFUSE, (1.0, 1.0, 1.0, 1.0))
# Camera transform matrix
camera_matrix = Matrix44()
camera_matrix.translate = (10.0, 1.0, 20.0)
print camera_matrix.translate
# Initialize speeds and directions
rotation_direction = Vector3()
rotation_speed = radians(90.0)
movement_direction = Vector3()
movement_speed = 5.0
objects_Render = []
ground = Ground()
while True:
for event in pygame.event.get():
if event.type == QUIT:
return
if event.type == KEYUP and event.key == K_ESCAPE:
return
# Clear the screen, and z-buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
time_passed = clock.tick()
time_passed_seconds = time_passed / 1000.
pressed = pygame.key.get_pressed()
# Reset rotation and movement directions
rotation_direction.set(0.0, 0.0, 0.0)
movement_direction.set(0.0, 0.0, 0.0)
# Modify direction vectors for key presses
if pressed[K_LEFT]:
rotation_direction.y = +1.0
elif pressed[K_RIGHT]:
rotation_direction.y = -1.0
if pressed[K_UP]:
rotation_direction.x = +1.0
elif pressed[K_DOWN]:
rotation_direction.x = -1.0
if pressed[K_d]:
rotation_direction.z = -1.0
elif pressed[K_a]:
rotation_direction.z = +1.0
if pressed[K_w]:
movement_direction.z = -1.0
elif pressed[K_s]:
movement_direction.z = +1.0
if pressed[K_n]:
# Beginning of objects_Render.append()
objects_Render.append(Cube_Projectile((0.0,0.0,0.0))) # End of objects_Render.append()
# Calculate rotation matrix and multiply by camera matrix
rotation = rotation_direction * rotation_speed * time_passed_seconds
rotation_matrix = Matrix44.xyz_rotation(*rotation)
camera_matrix *= rotation_matrix
# Calcluate movment and add it to camera matrix translate
heading = Vector3(camera_matrix.forward)
movement = heading * movement_direction.z * movement_speed
camera_matrix.translate += movement * time_passed_seconds
# Upload the inverse camera matrix to OpenGL
glLoadMatrixd(camera_matrix.get_inverse().to_opengl())
# Light must be transformed as well
glLight(GL_LIGHT0, GL_POSITION, (0, 1.5, 1, 7))
ground.render()
for obj in objects_Render:
print "Object: ", objects_Render.index(obj)
print "Object Position: ", obj.position, "\n"
tup = []
tup.append(obj.position[0] + random.uniform(-0.50,0.50))
tup.append(obj.position[1] + random.uniform(-0.50,0.50))
tup.append(obj.position[2] + random.uniform(-0.50,0.50))
obj.position = tuple(tup)
obj.render()
# Show the screen
pygame.display.flip()
run()