3

Bullet デモを Qt アプリケーションに統合したいと考えています。Bullet に付属の App_BasicDemo という Bullet デモ例を使用しています。

Qt なしでこのアプリケーションを実行すると、ウィンドウが開き、非常にうまくレンダリングされます。だから私は、これをQGLWidgetとして置くだけで、Qtウィンドウで同じことをするはずだと思った。しかし、うまくいきません。

GLWidget のコンストラクターで、BasicDemo を作成します。initializeGL では、BasicDemo の myinit と initPhysics を呼び出します。最後に、paintGL で clientMoveAndDisplay を呼び出します。

私が抱えていた最初の問題は、swapBuffers を呼び出すときに clientMoveAndDisplay がクラッシュすることでした。

その行にコメントするだけで、プログラムはクラッシュしませんが、何も表示されません。

私は何が欠けていますか?

編集:

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:

わかりました、私は答えを得たと思います。Bullet はウィジェットの幅と高さを必要とするため、openGL を初期化するときは、Demo の形状を一度変更する必要があります。これは、前に glutmain が呼び出されたとき、いくつかの Bullet メソッド内で行われたと思います...

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

トリックをしました。Bullet Demo が表示されるようになりました。(独立したBulletアプリケーションのように更新されませんが、それは別の問題です)

とにかくありがとうマーティン・ベケット!

4

1 に答える 1

0

コードがないと、問題が何であるかを知るのは非常に困難です - ウィジェットの更新/再描画メソッドの外で画面を更新しようとしているようです

OpenGLを使用しているかどうかに応じて、QWidgetまたはQGlWidgetで描画するためのQtの例を見ることから始めます。

Gui プログラミングに慣れていない場合、画面上の 1 か所にしか描画できないのは少し奇妙ですが、(最終的には) それは理にかなっており、Qt は学習するのに非常に適した場所です!

于 2012-03-30T15:49:13.290 に答える