Why are my cubes randomly rotating near the end of their animation? Also, why is the flat, stationary plane drawing with one edge"bending" into the origin?
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, 0.1, 10000.0)
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.5), random.uniform(0.0,1.5) , random.uniform(0.0,1.5)])
def render(self):
glColor(0.0, 1.0, 1.0)
glBegin(GL_QUADS)
glNormal(0.0, 0.0, 1.0)
glVertex3f(1.000000, 0.000000, 1.000000)
glVertex3f(-1.000000, 0.000000, 1.000000)
glVertex3f(1.000000, 0.000000, -1.000000)
glVertex3f(-1.000000, 0.000000, -1.0000000)
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])
glRotate(30, 1, 1, 0)
glBegin(GL_QUADS)
glNormal3f(1.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(-1.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()
glRotate(-30, -1, -1, 0)
glTranslatef(-self.position[0], -self.position[1], -self.position[2])
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, 2.0, 20.0)
# Initialize speeds and directions
rotation_direction = Vector3()
rotation_speed = radians(90.0)
movement_direction = Vector3()
movement_speed = 5.0
objects_Render = []
ground_1 = ground()
objects_Render.append(ground_1)
mouse_pos = pygame.mouse.get_pos()
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 = -5.0
elif pressed[K_s]:
movement_direction.z = +5.0
if pygame.mouse.get_pressed()[0]:
print pygame.mouse.get_pressed()[0]
new_mouse_pos = pygame.mouse.get_pos()
if new_mouse_pos != mouse_pos:
# rotation_direction.z = (float(new_mouse_pos[0]) - (mouse_pos[0]))/2.0
if new_mouse_pos > mouse_pos:
rotation_direction.z = ((1.0*new_mouse_pos[0]) - (1.0*mouse_pos[0]))/360
elif new_mouse_pos < mouse_pos:
rotation_direction.z = -((1.0*mouse_pos[0]) - (1.0*new_mouse_pos[0]))/360
if new_mouse_pos[0] > mouse_pos[0]:
rotation_direction.x = SCREEN_SIZE[1]/60.0 * .1
elif new_mouse_pos[0] > mouse_pos[0]:
rotation_direction.x = SCREEN_SIZE[1]/60.0 * -.1
mouse_pos = new_mouse_pos
mouse_pos = (0, 1)
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))
print event.type
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.70,0.50))
tup.append(obj.position[1] + random.uniform(-0.70,0.50))
tup.append(obj.position[2] + random.uniform(-0.70,0.50))
obj.position = tuple(tup)
obj.render()
# Show the screen
pygame.display.flip()
run()