Jump to content

  • Log In with Google      Sign In   
  • Create Account


What am I doing wrong with camera-following-object code?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 JoryRFerrell2013   Members   -  Reputation: 183

Like
0Likes
Like

Posted 04 September 2013 - 09:34 AM

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








Sponsor:

#2 JoryRFerrell2013   Members   -  Reputation: 183

Like
0Likes
Like

Posted 04 September 2013 - 09:49 AM

I will eventually get rid of the gluLookAt code. It is deprecated, and I am even upload a version of the same matrix, and altering it a little to replace LookAt won't be to diff...

but I just haven't messed with it yet. :P



#3 3TATUK2   Members   -  Reputation: 729

Like
0Likes
Like

Posted 04 September 2013 - 09:58 AM

 [deleted]


Edited by 3TATUK2, 04 September 2013 - 10:03 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS