2008年11月23日

IrrlichtとBulletの姿勢

IrrlichtのForumにProjectileがどうとか書かれていましたが、あれだけの情報だと何をして欲しいのか分かりませんね。

恐らくBulletとIrrlicht間で姿勢を一致させたいってことかなと思いまして、カメラが向いている方向にミサイルを飛ばしてみました。手抜きで剛体の上にバウンディングボックスで形状作成してます。

結論としては、よくわかりません。BulletにはgetRotation(クォータニオン)、getEuler(オイラー角)やgetOpenGLSubMatrix(回転行列)など色々姿勢情報も取得できますが、ワールド座標系とローカル座標系でも間違っているのかうまく取り扱えませんでした。

しょうがないので本やサンプルプログラム等を参考に関数を作って計算していますが、IrrlichtやBulletの関数を使えばできるはずです。ちょっとこれから忙しいので時間が空いたらちゃんと調べてみようと思います。

ミサイルはデフォルトではZ軸の正方向を前方にしていますので、ミサイルの姿勢とカメラの向いている方向ベクトルを一致させるには、ミサイルの3x3の回転行列のZ軸の基底ベクトルをカメラの向いている方向に設定します。Irrlichtではカメラの上方向のベクトルを取得できますので、2つのベクトルの外積で右方向のベクトルも取得できます。この3つの単位ベクトルをミサイルの回転行列に設定すれば、その方向を向いてくれます。

後はカメラの向いてる方向に力を掛ければミサイルが飛んで行き、重力に従って落ちたり物体に当たって跳ね返ったりは物理シミュレータに計算を任せ、計算結果をIrrlichtに反映させるだけです。

時間があれば追跡とか回避とかやろうかなと思いましたが、時間がないのでやらないと思います。

実行結果

無駄に光源と影を付けたら重くなりました。剛体が当たってもあまり面白くない気もしますね。かといってSoftbodyだと動かない気がするなぁ…。床からはみ出しても落下しないのは仕様です。



ソースコード

missile.cpp

web拍手 by FC2
posted by シンドラー at 00:25 | Comment(2) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2008年11月18日

Irrlicht+BulletでSoftbodyのテスト その5

複数オブジェクトを読み込めるようにしてみました。

main3.cpp

各オブジェクトごとにSoftBodyを作るまでは問題ないのですが、SoftBody同士をジョイントで繋ぐ方法がよくわかりません。

BulletのSoftBodyDemoではClusterを作ってappendLinearJointなどで繋いでいるので試してみたのですが、どうもうまく繋がってくれません。

まぁなんとなくそれっぽい結果は得られていますが、これ以外のモデルだときっとおかしなことになると思います。

モデルデータはいつもの如く三次元CG@七葉様のデータを使わせていただいております。

実行結果

頭と胴体の2つのオブジェクトです。




web拍手 by FC2
posted by シンドラー at 23:43 | Comment(2) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2008年11月17日

Irrlicht+BulletでSoftbodyのテスト その4

えー。情報をいただいたので少しソースを見直してみました。当社比5%ぐらい無駄が減った気がします。速度が変わったかどうかはわかりませんが。

main2.cpp

大きいサイズのMeshを読み込むとaddSoftBodyの所で止まってしまうので、IndexとVertexの限界みたいなのがあるんでしょうかね。

前回.objがおかしかったのは元のファイルが壊れていたようで、objでも一応読み込めるようです。

実行結果

screenshot_softbody_001.jpg

web拍手 by FC2
posted by シンドラー at 19:22 | Comment(1) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2008年11月14日

Irrlicht+BulletでSoftbodyのテスト その3

要望があったのでたまにはソースを公開しようと思います。

無駄な処理が多いと思いますがこんな感じです。

main.cpp

3ds maxやObjファイルをIrrlichtで読み込むと、頂点座標の数=Indexの数になってて、ファイル内の頂点座標の数よりかなり増えてておかしいなと思ったのですが、Indexは重ならない一意の値にしていて、頂点座標は重複ありにする仕様みたいです。

そのまま何も処理をせずにBulletに渡すと頂点数が多すぎて止まってしまいます。ですので、重複する頂点座標を消したりと面倒なことをやっています。はちゅねみくのモデルでデフォルトではIndex=Vertex=7000ですが、重複している点を除くと頂点数は1300ぐらいになります。

個人的な感想としては、結構いいPCでも頂点数2000超えるとつらそうです。頂点数7000のモデルは数分待っても動きませんでした。SoftBodyのパラメータにもよるかもしれませんが。

3ds maxのファイルは問題ないのですが、OBJファイルを読み込むとテクスチャがおかしくなるんですよね…。まあいいか。

ポイントは下記のように頂点座標へのポインタを取得すれば、ポインタを使って頂点座標を自由に変更できる点です。

IMeshBuffer *mb = cubeMesh->getMesh(0)->getMeshBuffer(cMeshBuffer);
S3DVertex* mb_vertices = mb->getVertices();

for (int i=0; i<mb->getVertexCount(); i++)
{
// 全部の頂点座標を(0, 0, 0)にしてみる
mb_vertices[i].Pos = vector3df(0, 0, 0);
}

こんな感じでBulletで取得した頂点座標をIrrlichtの頂点座標に反映させます。

複数マテリアルとか複数オブジェクトに対応していないと思いますが、基本的にはこんな感じです。

実行画面

メタセコ付属のモデルを.3dsに変換して読み込んでみました。問題があれば削除するので教えてください。

meka.jpg


web拍手 by FC2
posted by シンドラー at 17:51 | Comment(6) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする