My camera won't follow my object. Or maybe my object is not appearing where it should (meaning my camera is correctly oriented according to the cubes matrix, but I am drawing the cube with incorrect order of commands?).
Is my math wrong, or am I handling the drawing pipeline incorrectly?
SCREEN_SIZE = (1200, 900)
import sys
from math import radians
from math import cos
from OpenGL.GL import *
from OpenGL.GLU import *
import pygame
from pygame.locals import *
from gameobjects.matrix44 import *
from gameobjects.vector3 import *
from random import *
class Cube_Projectile(object):
def __init__(self, position):
self.abs_position = (0.0, 0.0, 0.0)
self.abs_rotation = [0.0, 0.0, 0.0]
self.abs_rot_matrix = [[1.0,0.0,0.0,0.0],
[0.0,1.0,0.0,0.0],
[0.0,0.0,1.0,0.0],
[0.0,0.0,0.0,1.0]]
self.color = (uniform(0.0, 1.0), 1.0, 2.0, uniform(0.0, 1.0))
self.life = 1000
self.name = ""
self.mass = 1
self.velocity = 0
self.momentum = self.mass*self.velocity
self.matrix = Matrix44()
def render(self, rotation, rot_matrix):
if self.life > 0:
glPushMatrix()
glLineWidth(10)
glBegin(GL_LINES)
glColor(3,0,0)
glVertex(0.0, 0.0, 0.0)
glVertex(0.0, 0.0, 25.0)
glColor(0,3,0)
glVertex(0.0, 0.0, 0.0)
glVertex(0.0, 25.0, 0.0)
glColor(0,0,3)
glVertex(0.0, 0.0, 0.0)
glVertex(25.0, 0.0, 0.0)
glEnd()
glPopMatrix()
glPushMatrix()
#glTranslate(self.abs_position[0], self.abs_position[1], self.abs_position[2])
rot_matrix.translate = self.abs_position
glLoadMatrixd(rot_matrix.to_opengl())
glScale(.5,.5,.5)
print "self.abs_rot_matrix: \n",self.abs_rot_matrix[0], "\n",self.abs_rot_matrix[1], "\n",self.abs_rot_matrix[2],"\n\n","Internal Matrix: \n",glGetDoublev(GL_MODELVIEW_MATRIX),"\n\n\n\n\n"
glColor(self.color)
glBegin(GL_QUADS)
glNormal3f(-1.0, -1.0, 1.0)
glVertex3f(-2.000000, -2.000000, -2.000000)
glNormal3f(-1.0, -1.0, 1.0)
glVertex3f(-2.000000, -2.000000, 2.000000)
glNormal3f(-1.0, 1.0, 1.0)
glVertex3f(-2.000000, 2.000000, 2.000000)
glNormal3f(-1.0, 1.0, -1.0)
glVertex3f(-2.000000, 2.000000, -2.000000)
glNormal3f(-1.0, 1.0, 1.0)
glVertex3f(-2.000000, 2.000000, -2.000000)
glNormal3f(1.0, 1.0, -1.0)
glVertex3f(2.000000, 2.000000, -2.000000)
glNormal3f(1.0, -1.0, -1.0)
glVertex3f(2.000000, -2.000000, -2.000000)
glNormal3f(-1.0, -1.0, -1.0)
glVertex3f(-2.000000, -2.000000, -2.000000)
glNormal3f(1.0, 1.0, -1.0)
glVertex3f(2.000000, 2.000000, -2.000000)
glNormal3f(-1.0, 1.0, 1.0)
glVertex3f(2.000000, 2.000000, 2.000000)
glNormal3f(1.0, -1.0, 1.0)
glVertex3f(2.000000, -2.000000, 2.000000)
glNormal3f(1.0, -1.0, -1.0)
glVertex3f(2.000000, -2.000000, -2.000000)
glNormal3f(-1.0, -1.0, 1.0)
glVertex3f(-2.000000, -2.000000, 2.000000)
glNormal3f(1.0, -1.0, 1.0)
glVertex3f(2.000000, -2.000000, 2.000000)
glNormal3f(1.0, 1.0, 1.0)
glVertex3f(2.000000, 2.000000, 2.000000)
glNormal3f(-1.0, 1.0, 1.0)
glVertex3f(-2.000000, 2.000000, 2.000000)
glNormal3f(-1.0, -1.0, 1.0)#---
glVertex3f(-2.000000, -2.000000, 2.000000)
glNormal3f(-1.0, -1.0, -1.0)
glVertex3f(-2.000000, -2.000000, -2.000000)
glNormal3f(1.0, -1.0, -1.0)
glVertex3f(2.000000, -2.000000, -2.000000)
glNormal3f(1.0, -1.0, 1.0)
glVertex3f(2.000000, -2.000000, 2.000000)
glNormal3f(1.0, 1.0, 1.0)
glVertex3f(2.000000, 2.000000, 2.000000)
glNormal3f(1.0, 1.0, -1.0)
glVertex3f(2.000000, 2.000000, -2.000000)
glNormal3f(-1.0, 1.0, -1.0)
glVertex3f(-2.000000, 2.000000, -2.000000)
glNormal3f(-1.0, 1.0, 1.0)
glVertex3f(-2.000000, 2.000000, 2.000000)
glEnd()
glPopMatrix()
def resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 1000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def init():
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_FLAT)
glClearColor(0.0, 0.0, 0.0, 1.0)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLight(GL_LIGHT0, GL_POSITION, (10, 10, 10, 0))
def run():
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE|OPENGL|DOUBLEBUF)
resize(*SCREEN_SIZE)
init()
PAUSED = "False"
clock = pygame.time.Clock()
glMaterial(GL_FRONT, GL_AMBIENT, (0.1, 0.1, 0.1, 1.0))
glMaterial(GL_FRONT, GL_DIFFUSE, (1.0, 2.0, 1.0, 1.0))
camera_matrix = Matrix44()
camera_matrix.translate = (0.0, 0.0, 0.0)
# Initialize speeds and directions
rotation_direction = Vector3()
rotation_speed = radians(90.0)
movement_direction = Vector3()
movement_speed = 5.0
obj_1 = Cube_Projectile((0, 0, 0))
obj_1.name = "obj 1"
obj_1.color = (4.0, 0.0, 0.0, 0)
objects_Render = []
objects_Render.append(obj_1)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYUP and event.key == K_ESCAPE:
pygame.quit()
sys.exit()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
time_passed = clock.tick()
time_passed_seconds = time_passed / 1000.0
pressed = pygame.key.get_pressed()
rotation_direction.set(0.0, 0.0, 0.0)
movement_direction.set(0.0, 0.0, 0.0)
if pressed[K_a]:
rotation_direction.y = +1.0
elif pressed[K_d]:
rotation_direction.y = -+1.0
if pressed[K_DOWN]:
rotation_direction.x = +1.0
elif pressed[K_UP]:
rotation_direction.x = -1.0
if pressed[K_RIGHT]:
rotation_direction.z = +1.0
elif pressed[K_LEFT]:
rotation_direction.z = -1.0
if pressed[K_s]:
movement_direction.z = -10.0
elif pressed[K_w]:
movement_direction.z = +10.0
elif pressed[K_n]:
objects_Render.append(Cube_Projectile((uniform(-2, 2), uniform(-2, 2), uniform(-2, 2))))
rotation = rotation_direction * rotation_speed * time_passed_seconds
rotation_matrix = Matrix44.xyz_rotation(*rotation)
camera_matrix *= rotation_matrix
heading = Vector3(camera_matrix.forward)
movement = heading * movement_direction.z * movement_speed
objects_Render[0].abs_position += movement * time_passed_seconds
print "Absolute Position: ", objects_Render[0].abs_position, "\n\n"
glLight(GL_LIGHT0, GL_POSITION, (0, 2, 1, 7))
for obj in objects_Render:
if objects_Render.index(obj) == 0:
obj.render(tuple([rotation[0], rotation[1], rotation[2], 0.0]), camera_matrix)
else:
obj.render(tuple([rotation[0], rotation[1], rotation[2], 0.0]), camera_matrix)
if len(objects_Render) != 0:
glLoadIdentity()
gluLookAt(camera_matrix.translate[0] - (10*heading[0]),
camera_matrix.translate[1] - (10*heading[1]),
camera_matrix.translate[2] - (10*heading[2]),
camera_matrix.translate[0],
camera_matrix.translate[1],
camera_matrix.translate[2],
camera_matrix.up[0],
camera_matrix.up[1],
camera_matrix.up[2])
else:
glLoadIdentity()
gluLookAt(0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
pygame.display.flip()
run()