2009-08-17 53 views
2

我试图用Pyglet的OpenGL包装来实现拾取,但我在将C tutorial转换为Python时遇到了麻烦。具体是下面的部分。用Pyglet拾取OpenGL

#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中执行此操作?谢谢。

回答

5

我没试过你的具体的例子,但声明数组的正常方式是在ctypes documentation。基本上你会创建一个像这样的数组类型:

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

这正是我所需要的。感谢您指点我正确的方向。 – exupero 2009-09-08 22:09:38

+0

没问题,欢迎来到本站:) – Kiv 2009-09-08 22:19:09

1

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

例如,this introduction是几乎到C相当于相同的,当涉及到OpenGL调用:

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()