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!
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 –