使用Pyglet进行OpenGL拾取
我正在尝试使用Pyglet的OpenGL封装来实现选择功能,但在把一个C语言教程转换成Python时遇到了麻烦。具体来说就是下面这部分。
#define BUFSIZE 512 GLuint selectBuf[BUFSIZE] void startPicking(int cursorX, int cursorY) { GLint viewport[4]; glSelectBuffer(BUFSIZE,selectBuf); glRenderMode(GL_SELECT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT,viewport); gluPickMatrix(cursorX,viewport[3]-cursorY, 5,5,viewport); gluPerspective(45,ratio,0.1,1000); glMatrixMode(GL_MODELVIEW); glInitNames(); }
我不太确定如何在Python中声明GLuint或GLint的数组,以便glSelectBuffer和glPickMatrix能够正常工作。有没有人知道如何在Pyglet中做到这一点?谢谢。
3 个回答
1
你遇到了什么具体的问题呢?Pyglet的OpenGL实现其实就是在DLL(动态链接库)上加了一层薄薄的包装,基本上是把C语言的调用一一对应地映射过来。所以很难想象还有其他库能在跟随C语言教程方面做得更好了。
举个例子,这个介绍在OpenGL调用方面几乎和C语言的版本一模一样:
from pyglet.gl import *
# Direct OpenGL commands to this window.
window = pyglet.window.Window()
@window.event
def on_draw():
glClear(GL_COLOR_BUFFER_BIT)
glLoadIdentity()
glBegin(GL_TRIANGLES)
glVertex2f(0, 0)
glVertex2f(window.width, 0)
glVertex2f(window.width, window.height)
glEnd()
pyglet.app.run()
1
5
我没有试过你提到的具体例子,但通常声明数组的方法可以参考ctypes的文档。简单来说,你可以这样创建一个数组类型:
FourGLints = GLint * 4
viewport = FourGLints(0, 1, 2, 3)