簡體   English   中英

如何在PyOpenGL中使用gluLookAt?

[英]How to use gluLookAt in PyOpenGL?

我正在嘗試學習PyOpenGL,但不確定如何使用gluLookAt移動相機。 我有顯示的圖像,但我想我可能缺少一些可以使用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的前三個輸入應該是“相機”的位置,對嗎? 因此,如果它正視原點並且相機的X位置正在移動,則它應該正在旋轉並移動表面,對嗎? 設置對象以使其與gluLookAt一起使用時,我需要做些特別的事情嗎? 調用它以將轉換應用於某物后,我是否需要做某事? 它是否需要在對象的繪圖代碼或gameLoop中?

GLU庫與固定功能管道一起使用。 當您使用頂點着色器時,它不適用於現代OpenGL(至少,除非您正在做兼容性配置文件,否則看起來好像您沒有這樣做)。 相反,您將創建等效矩陣,並將其用作您的制服之一。

等效功能的GLM源代碼在GitHub上的glm / glm / gtc / matrix_transform.inl中的lookAtRH函數中可用 使用此函數創建矩陣,將其與視圖矩陣的任何其他組件相乘,然后在頂點着色器中將其設置為統一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM