2012-03-30 6 views
2

Ich möchte eine Bullet-Demo in eine Qt-Anwendung integrieren. Ich verwende das Bullet-Demo-Beispiel, das mit Bullet geliefert wird, namens App_BasicDemo.Integrieren Sie eine einfache Bullet-Demo in Qt

Wenn ich diese Anwendung ohne Qt ausführen, öffnet es ein Fenster und rendert sehr gut. Also dachte ich mir, wenn ich dies nur als QGLWidget aufführe, sollte es dasselbe in einem Qt-Fenster tun. Aber es funktioniert nicht.

Im Konstruktor meines GLWidget, erstelle ich das BasicDemo. In initializeGL rufe ich myinit und initPhysics des BasicDemo auf. Und schließlich, in paintGL, rufe ich clientMoveAndDisplay auf.

Das erste Problem, das ich hatte, war, dass clientMoveAndDisplay beim Aufruf von swapBuffers abstürzen würde.

Wenn ich nur diese Zeile kommentiere, stürzt das Programm nicht ab, aber es zeigt nichts.

Was fehlt mir?

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, ich glaube, ich bekam die Antwort. Wenn ich openGL initialisiere, muss ich die Demo einmal umformen, da Bullet die Breite und Höhe meines Widgets benötigt. Ich schätze, das wurde innerhalb einer Bullet Methode gemacht, bevor es als glutmain bezeichnet wurde ...

scene-> umformen (this-> width, this-> height);

haben den Trick gemacht. Jetzt kann ich meine Bullet Demo sehen. (Es wird nicht wie in der unabhängigen Bullet-Anwendung aktualisiert, aber das ist ein anderes Problem)

Danke trotzdem Martin Beckett!

+0

Es gibt eine resizeGL Methode in QGLWidget, die automatisch vor der ersten Zeichnung aufgerufen werden sollte, Sie können Sachen dort hineinlegen. Manchmal müssen Sie es manuell aufrufen, wenn Ihre Engine Speicherplatz zuweisen muss, aber es ist sehr billig, eine resizeGL –

Antwort

0

Ohne Code ist sehr schwierig zu wissen, was das Problem ist - es klingt wie Sie einen Bildschirm außerhalb des Update zu aktualisieren versuchen,/neu zeichnen Methode des Widgets

ich mit Blick auf den Qt Beispiele für das Zeichnen beginnen würde in einem QWidget oder QGlWidget abhängig davon, ob Sie OpenGL verwenden oder nicht.

Wenn Sie neu in Gui Programmierung sind, ist es ein bisschen komisch, dass Sie nur auf dem Bildschirm an einem einzigen Ort zeichnen können, aber es wird Sinn (schließlich) und Qt ist ein sehr guter Ort zum Lernen!

+0

Ich nenne die Funktion der Bullet-Demo, die in der Widget-Methode namens PaintGL zeichnet. Ich habe das mit anderen OpenGL-Programmen gemacht, und es hat funktioniert. Da Bullet auch OpenGL verwendet, dachte ich, es sollte genauso funktionieren. – Sara

+0

QGlWidget hat automatisch Pufferwap auf standardmäßig sind Sie sie zweimal austauschen? –

+0

@sara klicken Sie auf Bearbeiten und fügen Sie es ein, dann gibt es ein Symbol wie {}, um es zu formatieren, oder einfach einen Kommentar hinterlassen und ich kann es für Sie formatieren. Versuchen Sie es und schneiden Sie es herunter, um nur Sachen zu finden, die relevant sind. –

Verwandte Themen