2016-10-11 12 views
1

Я пытаюсь изучить PyOpenGL, но я не уверен, как использовать gluLookAt для перемещения камеры. У меня есть отображение изображений, но я думаю, что, возможно, мне не хватает чего-то, что позволяет мне использовать gluLookAt? Входящая стена, я не знаю, где проблема. Я вырезал шейдеры и код текстуры, потому что я не думаю это актуально, но если это так, я могу опубликовать его.Как использовать gluLookAt в PyOpenGL?

import sys 
import ctypes 
import numpy 

from OpenGL import GL, GLU 
from OpenGL.GL import shaders 
from OpenGL.arrays import vbo 

import pygame 
from numpy import array 

class OpenGLSprite(): 
    def __init__(self,_sprite='',_vertexShader = None, _fragmentShader = None): 
     if not isinstance(_sprite, pygame.Surface): 
      self.sprite = pygame.image.load(_sprite) 
     else: self.sprite = _sprite 

     vertexData = numpy.array([ 
      # X Y Z U, V 
      -1.0, -1.0, 0, 0.0, 0.0, 
      -1.0, 1.0, 0, 0.0, 1.0, 
      1.0, 1.0, 0, 1.0, 1.0, 

      1.0, 1.0, 0, 1.0, 1.0, 
      1.0, -1.0, 0, 1.0, 0.0, 
      -1.0, -1.0, 0, 0.0, 0.0, 

      ], dtype=numpy.float32) 

     self.loadTexture() 
     self.buildShaders(_vertexShader, _fragmentShader) 

     self.VAO = GL.glGenVertexArrays(1) 
     GL.glBindVertexArray(self.VAO) 

     self.VBO = GL.glGenBuffers(1) 
     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.VBO) 
     GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, 
      GL.GL_STATIC_DRAW) 

     positionAttrib = GL.glGetAttribLocation(self.shaderProgram, 'position') 
     coordsAttrib = GL.glGetAttribLocation(self.shaderProgram, 'texCoords') 

     GL.glEnableVertexAttribArray(0) 
     GL.glEnableVertexAttribArray(1) 
     GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 20, 
      None) 
     # the last parameter is a pointer 
     GL.glVertexAttribPointer(coordsAttrib, 2, GL.GL_FLOAT, GL.GL_TRUE, 20, 
      ctypes.c_void_p(12)) 

     # load texture and assign texture unit for shaders 
     self.texUnitUniform = GL.glGetUniformLocation(self.shaderProgram, 'texUnit') 

     # Finished 
     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) 
     GL.glBindVertexArray(0) 

    def render(self): 
     GL.glClearColor(0, 0, 0, 1) 
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) 

     # active shader program 
     GL.glUseProgram(self.shaderProgram) 

     try: 
      # Activate texture 
      GL.glActiveTexture(GL.GL_TEXTURE0) 
      GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture) 
      GL.glUniform1i(self.texUnitUniform, 0) 

      # Activate array 
      GL.glBindVertexArray(self.VAO) 

      # draw triangle 
      GL.glDrawArrays(GL.GL_TRIANGLES, 0, 6) 
     finally: 
      GL.glBindVertexArray(0) 
      GL.glUseProgram(0) 


def main(): 
    pygame.init() 
    screen = pygame.display.set_mode((640,480),pygame.OPENGL|pygame.DOUBLEBUF) 
    GL.glClearColor(0.5, 0.5, 0.5, 1.0) 

    camX = 0.0 
    camZ = 3.0 

    sprite = OpenGLSprite('logo-bluebg-square.png') 

    status = 0 

    while status == 0: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       status = 1 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        status = 1 
       if event.key == pygame.K_LEFT: 
        camX -= 0.1 
       if event.key == pygame.K_LEFT: 
        camX += 0.1 

     GLU.gluLookAt(camX,0.0,camZ, 
         0.0,0.0,0.0, 
         0.0,1.0,0.0) 

     sprite.render() 

     pygame.display.flip() 

    return 0 

if __name__ == '__main__': 
    main() 

gluLookAt в главном цикле игры кажется, не делать ничего, независимо от того, какие параметры я могу изменить. Изменение camX с помощью клавиш не влияет ни на что, он просто смотрит прямо на поверхность. Насколько я понимаю, первые три входа в gluLookAt должны быть местоположением «камеры», правильно? Поэтому, если он смотрит в начало координат и положение X камеры движется, оно должно вращаться и перемещаться по поверхности, верно? Есть ли что-то особенное, что я должен сделать, настраивая объект, чтобы он работал с gluLookAt? Должен ли я что-то делать после того, как он назовет его применить к чему-то? Нужно ли быть в коде чертежа объекта или gameLoop?

+0

Я сам не использовал pyopengl. Однако, насколько я знаю, gluLookAt работает на стеке матриц. Получают ли ваши шейдеры доступ к вершине матричного стека (например, 'gl_ModelViewMatrix' или' gl_ModelViewProjectionMatrix')? Кроме того, я не вижу вызова glViewport или gluPerspective. 'gluLookAt', вероятно, не будет делать то, что вы хотите, без обращения к тем, кто находится в вашем коде. Удачи! – cxw

ответ

2

Библиотека GLU предназначена для использования с конвейером с фиксированной функцией. Он не работает с современным OpenGL, когда вы используете вершинные шейдеры (по крайней мере, если вы не делаете материал прошивки, но похоже, что вы этого не делаете). Вместо этого вы создадите эквивалентную матрицу и используете ее как часть одной из ваших мундиров.

Исходный код GLM для эквивалентной функции доступен по адресу GitHub in glm/glm/gtc/matrix_transform.inl, in the function lookAtRH. Используйте эту функцию, чтобы создать свою матрицу, умножить ее на любые другие компоненты вашей матрицы представлений и установить ее как унифицированную в своем вершинном шейдере.

+0

Кажется, что каждый раз, когда я попадал в ловушку, это из-за примера или учебника, делающего Legacy OpenGL, не сказав мне. Спасибо, я постараюсь выяснить GLM LookAt. Как использовать GLM в Python? Это была проблема, с которой я столкнулся раньше, что в конечном итоге привело меня к поиску GLULookAt –

+0

Вы не можете использовать GLM в Python, но GLM лицензирован MIT, и вы можете переопределить 'gluLookAt()' в Python. –

+0

Итак, я должен использовать gluLookAt? Я снова смущен. –

 Смежные вопросы

  • Нет связанных вопросов^_^