Интегрируйте простую демонстрацию Bullet в Qt - PullRequest
3 голосов
/ 30 марта 2012

Я хочу интегрировать демонстрацию 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, но это другая проблема)

Спасибо, Мартин Беккет!

1 Ответ

0 голосов
/ 30 марта 2012

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

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

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

...