1

QGLWidget と OpenGL を使用して、Qt (4.8.2)(VS 2008) でグラフィック アプリケーションをコーディングしています。アプリケーションの簡単な説明は次のとおりです。これは物理シミュレーションです。2 つのスレッドで構成されます。メイン アプリケーション スレッドは、シーンの描画 (QGLWidget サブクラス) とイベントを処理します。計算スレッドは、シミュレーションの次のステップを計算するループにあります。今...カーソルを使用してシミュレーションを操作したいと思います(オブジェクトのドラッグなど)。シーンでインテリジェントなレイ シューティングと空間空間の分解を行わないことにしたので (後でやらなければならないかもしれません)、コンピューティング スレッドに次のような処理を実行させたいと思います。

    glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
    glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
    glGetIntegerv(GL_VIEWPORT, viewport);
    gluProject(px, py, pz, modelviewMatrix, projectionMatrix, viewport, &x, &y, &z);

[px;py;pz] ポイントのスクリーン [x;y] 座標を取得し、シミュレーションの次のステップの計算に使用します。さて、メイン スレッドは常に正しい modelviewMatrix および ProjectionMatrix 配列を取得しますが、これが計算スレッドによって実行されると、トラッシュ マトリックス データが取得されます。私は多くのことを試しました... OpenGLをクエリする前にmakeCurrent()を実行し、OpenGLアクションをロックして、マトリックスが変更されないようにしましたが、成功しませんでした。これも可能ですか?シーンの描画後、OpenGL は行列を保持しますか? このコードをスレッドセーフにする方法はありますか?

4

1 に答える 1

0

メインスレッドでGLクエリを実行し、結果を計算スレッドに渡します。

于 2012-06-07T14:33:44.950 に答える