2012年02月22日

Bulletのレイキャスティングについて その6

Bulletのレイキャスティングを使って、MMD+MMEなどで良く用いられているSSAOを試してみました。
計算時間は512x512で数分かかります。

参考サイト
[1] http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20101122
[2] http://d.hatena.ne.jp/shuichi_h/20100318/

手順は以下のようにしました。

1. 視点から近クリップ面にレイを飛ばす
2. 当たったら、そこからn本のレイを拡散反射方向に飛ばす
3. n本中a本が衝突せず、残りの(n-a)本が衝突した場合、a/nの値をバッファに格納する
4. 3.で計算した値をガウスフィルタでぼかす
5. フィルタを掛けた結果をそこの色に掛けて最終的な色にする

2.のところがやはり時間がかかりますね。512x512=262,144で、そこから×n倍ですので、例えば500本飛ばしたら131,072,000本のレイを飛ばすことになります。

実行結果

200本飛ばしてフィルタなしが左、500本飛ばしてフィルタあり(5x5のガウスフィルタ)が右になります。
狭い部屋でレイを飛ばす距離を長くしているので、ほぼどこかに当たって暗くなるため無理やり明るくしています。

bullet_ssao_001.png bullet_ssao_002.png続きを読む


posted by シンドラー at 21:16| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2012年02月14日

Bulletのレイキャスティングについて その5

フォトンマッピングのようなものを試してみました。
今回からねんどろいど風ミクさんを使用させていただいております。

フォトンマッピング本には直接照明、鏡面反射、集光模様、間接照明のそれぞれを合計すれば完全なる大域照明になるとあるんですが、この辺りがよくわかりませんね。

BRDFの計算も何を使えばいいのか良く分からないですね。本にはシュリックのモデルが載っていましたが接線ベクトルとか適当でいいんでしょうか。

実行結果

フォトン10万を光源から飛ばし、単純に視点からレイを飛ばして当たった所の
近傍フォトン100個を探索した結果でレンダリングしています。
頭の上の方しかフォトンが殆ど当たりませんね。

bullet_photon_001.png

フォトン数50万で近傍5000個探索した結果+0.1倍のモデルの色の結果です。
適当にモデルの色を足したのでは駄目ですね。

bullet_photon_004.png

BRDFの計算と直接照明、鏡面反射、集光模様、間接照明辺りをちゃんとしないとあまりいい結果にならなさそうです。
posted by シンドラー at 19:46| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2012年02月13日

Bulletのレイキャスティングについて その4

フォトンマッピングやレイトレーシングを行う場合、レイが当たったところの色が必要になります。
PMDモデルの場合、大体テクスチャで色が決まっていますので、テクスチャ画像から色を取得します。

そのためにはレイが当たった点のテクスチャ座標が必要になりますので、法線ベクトル計算時についでにテクスチャ座標も計算してしまいます。
やり方は前回の3次元の法線ベクトルの部分を2次元のテクスチャ座標に変えるだけでできます。

MyClosestRayResultCallbackを作成していますので、当たったモデルの番号とインデックス番号を取得できます。
当たったのがPMDモデルの場合はそこから、Cornell Boxの場合はそちらの色を取得します。

実行結果

linear_003.png

当たった点の色を取得してGL_POINTSで描画しています。
これで大体準備が整ったので次はフォトンマッピングを試してみたいと思います。
posted by シンドラー at 00:50| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2012年02月11日

Bulletのレイキャスティングについて その3

昨日の続きです。

何となく線形補間の方を試してみました。
やり方がよくわからなかったのでかなり面倒な計算で出しました。

linear_001.png

参考文献
[1] 実例で学ぶゲーム3D数学

実行結果

linear_002.png

一応GLSLで取得した結果と同じものが得られていると思います。

しかし、どう考えてももっとスマートに計算できるはずなので、ちゃんとした計算方法をどなたか教えてください。
posted by シンドラー at 02:38| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2012年02月09日

Bulletのレイキャスティングについて その2

BulletのrayTestで視点から近クリップ面に向かってレイを飛ばしてみました。

前回の参考文献[1][3]から、衝突した点の座標と法線の情報が取れるとありましたので、m_hitPointWorldで得られたワールド座標に、m_hitNormalWorldを0~1の範囲にスケーリングした色でGL_POINTSで点を打った所、下記のような結果が得られました。

bullet_rayTest_001.png

はちゅねさんの面がはっきり見えているので、法線補間がされていないことが分かります。
当たり前といえば当たり前なんですが、このままフォトンマッピングすると何か影響が出てきそうな気がします。

ちなみにGLSLを使用した場合には、varyingで法線ベクトルを補間できますので、下記のような結果が得られます。

glsl_normal_001.png

フォトンを回収する時に行うレイトレーシングの1回目は、GLSLを使って衝突点と法線を計算した方が良さそうです。

ただ、ClosestRayResultCallbackを継承した派生クラスを作成すれば、当たった面のIndex情報が取得できますので、自分で法線ベクトルを補間することも出来ます。

そうしておいた方がフォトンをばら撒く時にちょっと正確になる気もします。
posted by シンドラー at 21:54| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2012年02月03日

Bulletのレイキャスティングについて

フォトンマッピングでレイとポリゴンの衝突判定が必要なのですが、自分で実装すると怪しいのと遅いのであまりいいことはないと思いますので、Bulletの衝突判定を使うことにしました。Bulletのバージョンは2.79でやっています。

参考
[1] Bullet Physics Demos: ConcaveRaycastDemo
[2] http://www11.atwiki.jp/darui_program/pages/328.html
[3] http://wikiwiki.jp/bulletlib/?%A5%EC%A5%A4

PMDファイルを読み込んで、btTriangleMeshとbtBvhTriangleMeshShapeを作りました。btConvexShapeにしなかったのは、凸包でレイとの衝突判定をされても困るからです。

後はデモを参考にrayTestを実行します。

実行結果

昔つくりかけで放置していたプログラムを改変してみました。



空中から50万フォトンを放出して、rayTestで衝突した点にGL_POINTSで点を打っています。
放出/衝突判定は最初に一回だけやっています。
さすがに50万フォントのリアルタイムは普通に使っただけでは無理そうです。
ConcaveRaycastDemoで実行されないBATCH_RAYCASTERの辺りが気になるのですが。
posted by シンドラー at 21:14| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2010年08月18日

Collision Filteringのメモ

http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Collision_Filtering

衝突フィルタリングに関するメモです。
何か以前も訳した気がするので同じ記事があるかもしれません。

Bulletを使って3Dのシューティングゲームのようなものを作ろうかと考えているのですが、Playerの操作をどうするかが難しいところですね。
KINEMATICかDYNAMICかCHARACTERか、どれを使ってもちょっと面倒そうな気がします。

基本的にはCF_CHARACTER_OBJECTを使えばいいような気がしますが。

今日の内容と全く関係のない実行結果



適当にOpenGLでレンダリングしているだけなので見た目がアレですね。
初期位置が適当なので球が嵌ってたり回転速度が速すぎて酔いそうだし困ったものです。

一応次回はマスクを使ってもう少しまともな操作ができるようにする予定です。
続きを読む
posted by シンドラー at 02:29| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2009年08月25日

物理シミュレータとIKについて

頑張って更新するとその後やる気が起きなくなって困りますね。

物理シミュレータで手抜きのIKって出来そうですよね。手先のBoneの位置だけ指定して、そこに向かってPD制御で力をかければ、Jointの制約で勝手にIKぽい動きをしてくれるのではないかと。

キーフレームアニメーションを物理計算する場合は下記のような方法でできるそうです。
http://www.tmps.org/index.php?%CA%AA%CD%FD%B7%D7%BB%BB%A4%CB%A4%E8%A4%EB%A5%AD%A1%BC%A5%D5%A5%EC%A1%BC%A5%E0%CA%E4%B4%D6

というわけで、BulletのBasicDemoを色々書き換えて、Ragdollっぽいものを作ってみました。Boneをカプセルで、接続部分を球で作ってbtGeneric6DofConstraintでつないでいます。

今回は特に制限などはつけていませんが、何をどの部分にどう繋いで可動範囲をどう指定するかとか結構面倒な気がしてきました。

後は接続先の位置を初期位置に設定して、その位置に向けて球にPD制御の力をかけています。

マウスで球を動かせば、その位置に手先が行ったりするので、IKもどきにはなるんじゃないかなーとは思います。あんまり使い道がない気もしますね。

実行結果


posted by シンドラー at 01:34| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2009年01月28日

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

タイトルから内容がわからなくて困ったものです。

今回は一応複数オブジェクト対応の第一歩をしてみました。

パラメータ調整が色々難しいですね。

今のところ実行結果のような感じです。

頭と胴体の2オブジェクトですが、パラメータ設定がおかしいと首だけ回転したりします。ホラーですね。

モデルは例によって3次元CG@七葉様のものであります。

実行結果


posted by シンドラー at 01:46| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2009年01月25日

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

というわけで、前回の続きです。

Bullet付属のSoftDemoを参考にマウスでドラッグを実装しました。SoftDemoはGLUTを使用しているので、基本的にはglutMouseFuncのmouseFunc()とglutMotionFuncのmouseMotionFunc()にマウス処理が書かれています。後はその時取得した情報から描画ループのclientMoveAndDisplay()で更新といった感じです。

何をやっているかはSoftDemoの上記の関数を見れば大体わかると思います。まぁドラッグ中のマウスの座標と現在のノードの座標の差を比例制御で動かしているような気がします。比例だけだと収束しないのでPID制御とかに改良するといいのかもしれません。

マウスでクリックした位置の取得は、少し前に試した視錐体のアレをIrrlichtとBullet用に少し変更して使いました。

軽いモデルなら実行結果のようにそれなりに動きますが、頂点数が7000超えるようなモデルだと衝突時に遅くなっちゃいますね。この辺りもパラメータをうまく設定すれば改善できそうな気もしないでもないです。

次は・・・複数オブジェクトを持つモデルへの対応が中途半端だったのでそれをなんとかするかもしれません。

実行結果


posted by シンドラー at 18:47| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2009年01月24日

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

昨日の続きです。

Softbody同士の衝突が剛体っぽかったのは、パラメータのせいでした。generateBlendConstraintsとgenerateClustersの値を変えたら揺れ具合が色々変わりました。マー相変わらず役割は良くわかりませんが。

一応GUIも少し作ってみましたが、リセットがうまくいっていません。IrrlichtのMesh情報が残ってしまっているようで。この辺はIrrlichtの問題ですね。dropしただけでは駄目なんですかね。

次は以前中途半端にしていたマウスでSoftbodyのドラッグをやろうかなと思います。

実行結果


posted by シンドラー at 02:22| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2009年01月23日

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

ここ数日はOgre3D関係をちょっとやっているのですが、うまくいっていないので別のことでもしようと思います。

というわけで、Softbodyのパラメータを調べてみたいので、CEGUIを使って実行時にパラメータ調整できるようにしたいと思います。

とりあえず以前作ったプログラムにCEGUIを付け加えて、FPSを表示するようにしてみました。

ちゃんと60Hzで回っているのにシミュレーションが遅く見えるのはなぜでしょうかね。stepSimulationの引数を変えてみてもあまり変わらないし。仕様なのかパラメータ設定のせいなのか・・・。

一応Softbody同士も衝突判定するようなフラグを設定しているのですが、見てわかるように剛体っぽい衝突です。仕様なのかパラメータ設定のせいなのか・・・。

        softBody->m_cfg.kDP = 0.0;// Damping coefficient [0,1]
softBody->m_cfg.kDF = 0.2;// Dynamic friction coefficient [0,1]
softBody->m_cfg.kMT = 0.02;// Pose matching coefficient [0,1]
softBody->m_cfg.kCHR = 1.0;// Rigid contacts hardness [0,1]
softBody->m_cfg.kKHR = 0.8;// Kinetic contacts hardness [0,1]
softBody->m_cfg.kSHR = 1.0;// Soft contacts hardness [0,1]
softBody->m_cfg.piterations=2;
softBody->m_materials[0]->m_kLST = 0.8;
softBody->m_materials[0]->m_kAST = 0.8;
softBody->m_materials[0]->m_kVST = 0.8;
softBody->scale(btVector3(scale.X, scale.Y, scale.Z));
softBody->setPose(true, true);
softBody->generateBendingConstraints(2);
softBody->randomizeConstraints();
softBody->generateClusters(1);
softBody->m_cfg.collisions = btSoftBody::fCollision::CL_SS+btSoftBody::fCollision::SDF_RS;
Softbody同士の衝突は、多分generateClustersでクラスタ作るのと、m_cfg.collisionsでbtSoftBody::fCollision::CL_SSフラグを立てる必要があるのではないかと思っています。

なお、本実行結果で用いているモデルは、三次元CG@七葉様とメタセコイア付属のモデルを使わせていただいております。問題がありましたらお知らせください。

実行結果


posted by シンドラー at 00:41| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

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
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つのオブジェクトです。



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
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

posted by シンドラー at 17:51| Comment(6) | TrackBack(0) | Bullet | 更新情報をチェックする

2008年10月31日

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

前回の続きです。

マウスでピーッとやりたかったので、BulletのDemoApplicationクラスとSoftDemoクラスを参考にしてみようと思いました。

btRigidBodyのときはクリック位置からレイを飛ばして接触した点にPoint2PointのConstraintを作成しているようですが、btSoftBodyの場合はどうやっているのかいまいちよくわかりませんでした。

しょうがないので、btSoftBodyクラスのrayCast関数とappendAnchor関数を使って適当にやってみました。

IrrlichtのFPSカメラで位置とカメラ方向が取れるのでそこからレイを飛ばして接触したfaceのnodeと球体のRigidBodyをappendAnchorで繋いでいます。球体はキーボードで動かすようにしています。

気が向いたらちゃんとnodeをドラッグできるようにするかもしれません。

実行結果

posted by シンドラー at 20:08| Comment(0) | TrackBack(0) | Bullet | 更新情報をチェックする

2008年10月29日

Irrlicht+BulletでSoftbodyのテスト

BulletのSoftbodyをIrrlichtで描画するテストです.

使用するライブラリはlibbulletsoftbody.libで,btSoftBodyHelpers::CreateFromTriMesh関数で三角メッシュからSoftbodyを作っています.この辺りはBulletのappSoftBodyDemoが参考になると思います.

実行結果

画質が悪いのでわかりにくいかもしれませんが,一応プルプルしてます.

続きを読む
posted by シンドラー at 19:18| Comment(4) | TrackBack(0) | Bullet | 更新情報をチェックする

2008年09月10日

Bullet Tutorial : Hello World Application

最近ネタとやる気が不足しているので、Bulletでも試してみようと思います。
http://www.bulletphysics.com/Bullet/wordpress/
MayaプラグインとかJava用とかiPhoneでテストとか色々やっていますねぇ。

こちらのページで色々解説されてますのでいらないかなーとも思いましたが。
ttp://monsho.hp.infoseek.co.jp/index.html

Broadphaseとかよくわかりませんね。衝突検出アルゴリズムを切り替えるための仕組みか何かでしょうか。

ちなみにOgreBulletもIrrlicht+Bulletもあります。Bulletの更新が早いので最新バージョンとはいかないようですが。

続きを読む
posted by シンドラー at 16:21| Comment(3) | TrackBack(0) | Bullet | 更新情報をチェックする