別件でAndroid NDKを使った勢いで、物理演算エンジンBulletで遊んでみたくて、色々試してみた(去年か一昨年の話ね)。
まずは、Bullet2.81-rev2613をダウンロードしてきて、パソコン上でコンパイル・実行。お〜動いた動いた。デモのプログラムはゲームとは呼べないけど、箱を発射して壁を壊したりフォークリフトで箱を運んでみたりできて結構楽しい。ここまでは楽勝ね。
続いてAndroidでも行くで〜と
麗ちゃんとママの実験ノート – OpenGLによる3D描画とBulletによる物理演算の縫合メモ
とか、
3D物理エンジンbulletをAndroidで使ってみた
とか、
本家本元のbullet – Bullet is a professional free 3D Real-Time Multiphysics Library
とかを参考にして実行。
お〜動いたぁ\(^o^)/・・・う〜ん、パソコン上と違って付属のデモが動かないからかかなり寂しい(;_;)
もっと動くのがあったらいいなぁ♪とWebで検索してみると、Androidで動かしてみたってのはぽつぽつあるものの、付属のデモを動かしたってのはなさそう。残念(´・ω・`)
やっぱりC/C++とJavaのミックスで作るのが敷居高いのかなぁと、JavaでできたJBulletもチェック・・・うぅん。
Bullet自体はlibgdxとかにも組み込まれててJavaから使えるようになっているんだけど、遊びで試すには敷居高いよねぇ。libgdxだとそもそもエラー無くコンパイルできるとこに辿り着くまでが険しい道程だし、い〜っぱいファイルがやクラスがあってお気軽にいじくり回すのははっきりいって難しい。
と言うことで、全部とは言わないけど付属のデモをJavaから動かせるようにしたいなぁってことで、少し頑張ってみました。でも今思うとC/C++で全部作るとか、libgdxの攻略の方がずっと楽だった気もするのは気のせい?
基本方針は、
- Androidライブラリプロジェクトとして作成する(jarを外部参照してnariveの共有ライブラリをコピーすればライブラリプロジェクトにしなくても動かせるけど)。
- Bulletライブラリ本体は基本的にいじらない。
- Java・Native側双方にインターフェース用の関数を作成する。
- 使う時はJavaから全部設定・実行できるようにする。
現時点で動くようになったのは、
1.麗ちゃんとママの実験ノート – OpenGLによる3D描画とBulletによる物理演算の縫合メモの虹色の箱をおっことすデモ
先駆者達に敬意を表して。
スクリーンショットはこんな感じ。実際に動かしてみた時には、地面に落下した瞬間にちょびっとだけバウンドする感じを見てほしいっす。このデモはJava側で初期化・シミュレーション実行・描画を全部行うサンプルを兼ねています。
これ以外のデモは、実行速度向上のために、専用のSurfaceViewとActivityを使って描画の大部分をnative側で行うようにしています(その分Javaでの処理はかなり簡略化出来ます)。
2.箱の塊を球体の上に落っことしてバラバラになるデモ(自前)
スクリーンショットはこんな感じ。これは見た目だけはそれなりに出来たつもり。と言っても視点の変更・拡大縮小と、タッチして小箱を打つ以外には何も出来ないけど。
3.丸机に乗った球体めがけて球体を落っことして転がすデモ(自前)
床が無駄にウエーブしているのでしばらく転がってます。