使用Pyglet进行OpenGL挑选

时间:2009-08-17 20:35:32

标签: python opengl pyglet picking

我正在尝试使用Pyglet的OpenGL包装器实现拾取,但是我在将C tutorial转换为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();
}

我不确定如何转换声明GLuint或GLint的数组,以便glSelectBuffer和glPickMatrix工作。有没有人知道如何使用Pyglet在Python中执行此操作?感谢。

3 个答案:

答案 0 :(得分:5)

我没有尝试过您的特定示例,但声明数组的常规方法是ctypes documentation。基本上你会创建一个这样的数组类型:

FourGLints = GLint * 4
viewport = FourGLints(0, 1, 2, 3)

答案 1 :(得分:1)

我对PyOpenGL运气不错。

http://pyopengl.sourceforge.net/

这很简单,我相信使用C教程会更容易。

答案 2 :(得分:1)

你究竟遇到了什么样的麻烦? Pyglet的OpenGL实现是DLL的一个薄包装器,几乎可以一对一地映射C调用。很难想象在遵循C教程方面会有更好的其他库。

例如,当涉及到OpenGL调用时,this introduction几乎与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()