2009-08-17 17 views
2

J'essaye d'implémenter le picking en utilisant le wrapper OpenGL de Pyglet, mais j'ai du mal à convertir un C tutorial en Python. Plus précisément la partie ci-dessous.OpenGL Picking avec Pyglet

#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(); 
}

Je ne suis pas sûr de savoir comment transformer déclarer des tableaux de GLuint ou Glint tels que le travail glSelectBuffer et glPickMatrix. Est-ce que quelqu'un sait comment faire cela en Python avec Pyglet? Merci.

Répondre

5

Je ne l'ai pas essayé votre exemple particulier, mais la façon normale de déclarer des tableaux est dans la ctypes documentation. Essentiellement, vous devez créer un type de tableau comme ceci:

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

C'est exactement ce dont j'avais besoin. Merci de m'avoir indiqué la bonne direction. – exupero

+0

Pas de problème, bienvenue sur le site :) – Kiv

1

Exactement quel genre de problème avez-vous? L'implémentation OpenGL de Pyglet est un wrapper fin sur la DLL et mappe à peu près les appels C un pour un. Il est difficile d'imaginer qu'il y aurait une autre bibliothèque qui pourrait mieux suivre un tutoriel en C.

Par exemple, this introduction est à peu près identique à la C équivalente en ce qui concerne les appels 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()