How to use gluLookAt in PyOpenGL?
我正在尝试学习PyOpenGL,但不确定如何使用gluLookAt移动相机。我有显示的图像,但我想我可能缺少一些可以使用gluLookAt的东西?文本墙进来,我不确定问题可能在哪里。我已经删掉了着色器和纹理代码,因为我认为这无关紧要,但是如果需要,我可以发布它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 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函数中找到。 使用此函数创建矩阵,将其与视图矩阵的任何其他组件相乘,然后在顶点着色器中将其设置为统一的。