2016-10-11 5 views
1

私はPyOpenGLを学習しようとしていますが、私はgluLookAtを使ってカメラを移動する方法がわかりません。画像が表示されていますが、gluLookAtを使用できる何かが不足している可能性がありますか?入ってくる壁の文章では、どこに問題があるのか​​分かりません。私はシェイダーとテクスチャコードを切り捨てました。なぜなら、私はと考えています。それは関連していますが、それがあれば投稿できます。PyOpenGLでgluLookAtを使用するには?

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への最初の3つの入力は「カメラ」の場所でなければなりません。だから、原点を見て、カメラの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

これは、私が突っ込んだときのたびに、それは私に言わずにレガシーOpenGLをやっている例やチュートリアルのためです。ありがとう、私はGLM LookAtを把握しようとします。 PythonでGLMを使用するにはどうすればよいですか?それは私が前に遭遇した問題で、最終的にGLULookAtを見つけることにつながった。 –

+0

PythonでGLMを使うことはできないが、GLMはMITのライセンスを受けているので、Pythonでは 'gluLookAt()'を再実装することができる。 –

+0

だから、私はgluLookAtを使用するはずですか?私は再び混乱している。 –

関連する問題