Интегрируйте простую демонстрацию Bullet в Qt

Я хочу интегрировать демонстрацию Bullet в приложение Qt. Я использую демонстрационный пример Bullet, который поставляется с Bullet, под названием App_BasicDemo.

Если я запускаю это приложение без Qt, оно открывает окно и очень хорошо рендерится. Поэтому я подумал, что если я просто добавлю это как QGLWidget, он должен сделать то же самое в окне Qt. Но это не работает.

В конструкторе моего GLWidget я создаю BasicDemo. В initializeGL я вызываю myinit и initPhysics из BasicDemo. И, наконец, в paintGL я вызываю clientMoveAndDisplay.

Первая проблема, с которой я столкнулся, заключалась в том, что clientMoveAndDisplay зависал при вызове swapBuffers.

Если я просто прокомментирую эту строку, программа не вылетает, но ничего не показывает.

Что мне не хватает?

Редактировать:

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, но это другая проблема)

В любом случае, спасибо, Мартин Беккет!

1 ответ

Без кода очень трудно понять, в чем проблема - похоже, вы пытаетесь обновить экран вне метода обновления / перерисовки виджета

Я бы начал с просмотра примеров Qt для рисования в QWidget или QGlWidget в зависимости от того, используете ли вы OpenGL или нет.

Если вы новичок в программировании на Gui, немного странно, что вы можете рисовать на экране только в одном месте, но это будет иметь смысл (в конце концов), и Qt - очень хорошее место для изучения!

Другие вопросы по тегам