使用Pyglet进行OpenGL拾取

2 投票
3 回答
2489 浏览
提问于 2025-04-15 13:39

我正在尝试使用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

我在使用PyOpenGL的时候运气不错。

http://pyopengl.sourceforge.net/

这个库使用起来很简单,我觉得用C语言的教程来学习会更容易。

5

我没有试过你提到的具体例子,但通常声明数组的方法可以参考ctypes的文档。简单来说,你可以这样创建一个数组类型:

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

撰写回答