7

私は、弾丸の物理学をopengl描画オブジェクト(glVertex3fまたはglVertexAttribPointerを使用した三角形メッシュを使用して作成)に適用する方法があるかどうか疑問に思っていました. 現在、jogl と jbullet を使用して、3D オブジェクトに物理学を適用しています。具体的には、3D オブジェクトの三角形のメッシュ形状に頂点のバッファーを与える場合です。三角形のメッシュ形状に基づいて CollisionShape を作成し、それに物理を適用するために Bullet が必要です。同時に、描画された opengl オブジェクトに物理を適用します。現時点では、物理的な衝突形状は (弾丸で) 移動する可能性がありますが、描画された OpenGL 形状は移動しません。

それ以外の場合は、衝突形状を作成し、各シミュレーション ステップの後に物理が適用された後に衝突形状の頂点を取得し、頂点の位置に基づいてオブジェクトを描画できますか。私は弾丸のHello worldの例を見てきましたが、openglオブジェクトの位置に物理学を適用するのに役立ちます(z、y、x軸に基づいて_、たとえば立方体の角が平面にぶつかるなどのクールなものではありません)ローリングとスピニング。

誰かがこれを実行できるコードまたはデモを提供してくれれば幸いです。または、これを機能させる方法についてのヒントを教えてください。私はすでに弾丸に関するこのチュートリアルを見ました: http://www.raywenderlich.com/53077/bullet-physics-tutorial-getting-started . しかし、弾丸がopenglオブジェクトにどのように適用されるかについての情報が見つからないようです。

4

4 に答える 4

5

Bullet Physics SDK をダウンロードした後、ファイル GL_ShapeDrawer.cpp を見ると、drawSphere、drawCylinder、drawOpenGl などの興味深い関数がいくつか見つかります。最後に言及した関数では、サポートされている任意のタイプの形状を描画できます。

  • CUSTOM_CONVEX_SHAPE_TYPE
  • BOX_SHAPE_PROXYTYPE
  • UNIFORM_SCALING_SHAPE_PROXYTYPE
  • COMPOUND_SHAPE_PROXYTYPE
  • BOX_SHAPE_PROXYTYPE
  • SPHERE_SHAPE_PROXYTYPE

shape->getShapeType() の各タイプの形状には、opengl でレンダリングするための独自の専用関数があります。

しかし、私の方法には、

  • 1 - メッシュ ローダーを使用して 3D モデルをロードする
  • 2 - 以前のメッシュ ローダーを使用して、opengl 関数でグラフィック シェイプを作成します。
  • 3 - メッシュ ローダーで使用される頂点から弾丸の形状を作成する
  • 4 - Bullet Motion State を実装します (形状を回転または平行移動するか、単に「変換」する場合は、弾丸形状の「btTransform」をグラフィック形状の変換マトリックスと同期させてから、グラフィック頂点を更新します)。

個人的には、Irrlicht は opengl の「書き込みを減らし、より多くのことを行う」ソリューションであるため、Irrlicht を使用しています :p

于 2014-11-17T08:06:38.543 に答える
5

Bullet サンプルブラウザ

ツリー内のサンプル ブラウザーには、いくつかの OpenGL 物理バインディングが含まれているため、シミュレーションを簡単に視覚化できます。

動作を確認するには、次のようにコンパイルして実行します。

sudo apt build-dep libbullet-dev
git clone https://github.com/bulletphysics/bullet3
cd bullet3
git checkout 2.89
./build_cmake_pybullet_double.sh
./build_cmake/examples/ExampleBrowser/App_ExampleBrowser

スクリーンショット:

ここに画像の説明を入力

Ubuntu 20.04 でテスト済み。

サンプルブラウザ 2.83 コード分析

Bullet のサンプル ブラウザは、時代遅れの即時OpenGL 2 メソッドexamples/ExampleBrowser/GL_ShapeDrawer.cpp を使用するデフォルトの から離れました。マクロとコマンド ライン引数の値によっては、オンにすることもできます。NO_OPENGL3

OpenGLWindow/GLInstancingRenderer.cppは新しい OpenGL 3 レンダリングの中心的存在でありglBindVertexArrayGLInstancingRenderer::registerShape.

このメソッドは から間接的に呼び出されOpenGLGuiHelper::autogenerateGraphicsObjects、 内のオブジェクトをループして、btDiscreteDynamicsWorldそれらの形状のグラフィック バージョンを生成します。

変換の中心部分は のようOpenGLGuiHelper::createCollisionShapeGraphicsObjectInternalです。

オブジェクトの色は、 からの 4 つの可能な色を単純にループしますOpenGLGuiHelper::sColors

autogenerateGraphicsObjectsinitPhysicsは、いくつかの例のから呼び出されます。

また、いくつかの明示的にエンコードされた立方体と球体が次SimpleOpenGL3App.cppの場所にあります:計算コストが低くなります。これらは、いくつかの例でのみ使用されます。

サンプル ブラウザーを研究する場合は、デバッガーを備えた IDE を使用することをお勧めします。この分析は KDevelop4 で行いました。

于 2016-05-05T20:24:02.800 に答える
0

Bullet または OpenGL の詳細を調べずに (私は OpenGL で少しコーディングしました)、オブジェクトに Bullet を 2 回適用したいと考えているようです。

メモリ オブジェクトに OpenGL オブジェクトを作成し、Bullet メソッドを適用して CollisionShape (それが何であれ) を取得し、このデータをメモリに保存し、Bullet メソッドをこの新しい三角形リストに適用してワールド ポジショニングを行うことが問題になるようです。 (あなたの質問に対する私の理解が正しければ)。

これは、行列演算を利用せずに、オブジェクトに 2 つの異なる変換を別々に適用することに似ています。回転に基づいてベクトルの新しい位置を計算し、これらのポイントを取得した後、平行移動に基づいてワールド内でそれらを移動します。2 番目の翻訳を適用するためにメモリ内で使用される中間ステップがあります。それが、自分で思いつくことができるかどうかを確認するためにどのように行われたかを学ばずに作成した最初の 3D レンダリングで行った方法です。

多分これはあなたを助けるでしょう、多分それはしません。そうでない場合は、問題が発生している場所を説明してください。私 (または他の人) は、OpenGL と Bullet の詳細を調べて、実際のアルゴリズムを考え出すことができます (ただし、おそらくどこかに存在すると確信しています)。 . 十分に検索すれば、似たようなことを行うコードが Interwebs で見つかる可能性があります。変更したり、自分で試してみることもできます。

私の方法がうまくいかないかもしれませんが、あなたの質問を正しく理解していればうまくいかない理由はわかりません(そもそも「CollisionShape」が何であるかを知らないかもしれません)。

于 2014-11-15T16:48:44.240 に答える