Я хочу интегрировать демонстрацию Bullet в приложение Qt. Я использую демонстрационный пример Bullet, который поставляется с Bullet, под названием App_BasicDemo.
Если я запускаю это приложение без Qt, оно открывает окно и очень хорошо рендерится. Поэтому я подумал, что если я просто добавлю это как QGLWidget, он должен сделать то же самое в окне Qt. Но это не работает.
В конструкторе моего GLWidget я создаю BasicDemo. В initializeGL я вызываю myinit и initPhysics из BasicDemo. И, наконец, в paintGL я вызываю clientMoveAndDisplay.
Первая проблема, с которой я столкнулся, заключалась в том, что clientMoveAndDisplay зависал при вызове swapBuffers.
Если я просто прокомментирую эту строку, программа не завершится сбоем, но ничего не отобразится.
Чего мне не хватает?
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();
}
Редактировать 2:
Хорошо, я думаю, что получил ответ. Когда я инициализирую openGL, мне нужно один раз изменить форму демонстрации, потому что Bullet нужна ширина и высота моего виджета. Я предполагаю, что это было сделано в каком-то методе Bullet раньше, когда он вызывал glutmain ...
scene-> изменения формы (этом-> ширина, этом-> высота);
сделал свое дело.
Теперь я могу видеть мое демо Bullet. (Он не обновляется, как в независимом приложении Bullet, но это другая проблема)
Спасибо, Мартин Беккет!