2012-03-30 6 views
2

Je veux intégrer une démo Bullet dans une application Qt. J'utilise l'exemple de démonstration Bullet fourni avec Bullet, appelé App_BasicDemo.Intégrer une démo Bullet simple en Qt

Si j'exécute cette application sans Qt, cela ouvre une fenêtre et rend très bien. J'ai donc pensé, si je viens de mettre cela comme un QGLWidget, il devrait faire la même chose dans une fenêtre Qt. Mais ça ne marche pas.

Dans le constructeur de mon GLWidget, je crée le BasicDemo. Dans initializeGL, j'appelle myinit et initPhysics du BasicDemo. Et enfin, dans paintGL, j'appelle clientMoveAndDisplay.

Le premier problème que j'ai eu, était que clientMoveAndDisplay se bloquerait lors de l'appel de swapBuffers.

Si je commente simplement cette ligne, le programme ne plante pas, mais il ne montre rien.

Qu'est-ce qui me manque?

Edit:

void GLWidget::paintGL() { 
     scene->clientMoveAndDisplay(); 
     QGLWidget::swapBuffers(); 
} 

void BasicDemo::clientMoveAndDisplay(){ 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     float ms = getDeltaTimeMicroseconds(); 
     renderme(); 

     glFlush(); 

     //swapBuffers(); 
} 


void BasicDemo::displayCallback(void) { 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     renderme(); 

     //optional but useful: debug drawing to detect problems 
     if (m_dynamicsWorld) 
        m_dynamicsWorld->debugDrawWorld(); 

     glFlush(); 
     swapBuffers(); 
} 

Edit 2:

Ok, je pense que je suis la réponse. Quand j'initialise OpenGL, je dois reformer une fois la démo, car Bullet a besoin de la largeur et de la hauteur de mon widget. Je suppose que cela a été fait à l'intérieur d'une certaine méthode Bullet avant, quand il a appelé glutmain ...

scène-> reshape (this-> largeur, this-> hauteur);

a fait l'affaire. Maintenant, je peux voir ma démo Bullet. (Il n'est pas mis à jour comme dans l'application indépendante Bullet, mais c'est un autre problème)

Merci quand même Martin Beckett!

+0

Il y a une méthode resizeGL dans QGLWidget qui devrait être appelée automatiquement avant le premier tirage, vous pouvez mettre des choses dedans. Parfois, vous devez l'appeler manuellement si votre moteur a besoin d'allouer de l'espace, mais il est très bon marché de faire un resizeGL –

Répondre

0

Sans code est très difficile de savoir ce que le problème est - il semble que vous essayez de mettre à jour un écran en dehors de la mise à jour/redessiner la méthode du widget

Je voudrais commencer par regarder les exemples Qt pour le dessin dans un QWidget ou QGlWidget selon que vous utilisez OpenGL ou non. Si vous êtes nouveau dans la programmation Gui, il est un peu étrange que vous ne puissiez dessiner sur l'écran qu'à un seul endroit, mais cela aura du sens (finalement) et Qt est un très bon endroit pour apprendre!

+0

J'appelle la fonction de démo balle qui dessine dans la méthode widget appelée paintGL. Je l'ai fait avec d'autres programmes OpenGL, et cela a fonctionné. Puisque Bullet utilise aussi Opengl, j'ai pensé que ça devrait fonctionner de la même manière. – Sara

+0

QGlWidget a la mémoire tampon automatique activée par défaut est-ce que vous les permutez deux fois? –

+0

@sara cliquez sur éditer et collez-le dans, puis il ya une icône comme {} pour le formater, ou laissez simplement un commentaire et je peux le formater pour vous. Essayez de le réduire à des choses qui sont pertinentes. –