<TIPS> ・Box2Dでは、MKS単位系(メートル・kg・秒を基本単位とする単位系)が採用されている ・ピクセルとメートルの比率(PTM:Pixel to Meter)を決めて置く必要がある ・Box2Dで扱う数値は、 ①長さ:ピクセル単位ではなく、m(メートル)単位 ②重さ:kg(キログラム)単位 ③時間:s(秒)単位 ④速度:m/s ⑤加速度:m/s^2 ⑥力:kg・m/s^2=N(ニュートン)単位 ⑦運動量・力積:kg・m/s=N・s ⑧角度:rad(ラジアン)単位で、時計回りが正,2π(パイ)rad=約6radで1回転,半径を乗算するとその角度の弧長になる ⑨回転速度:rad/s(ラジアン毎秒)単位,1にすると1秒で1radのため、約6秒で約6radつまり1回転 ⑩[[トルク]](回転力):N・m(ニュートンメートル)単位,1にすると回転軸から1mの点に1Nの力をかけた力のモーメント ・Box2Dで扱いやすいスケールは、0.1m(=10cm)から10m ・density=密度で、kg/m^2単位であり、 密度が1の場合、大きさが1m^2の物体の質量は1kg ・restitution=反発係数で、物体が衝突した時の跳ね返る度合であり、 0にすると、全く反跳しない 1にすると、自然落下時に同じ高さまで反跳するため、収束せずいつまでも反跳し続ける 通常は、0以上1未満の範囲で設定 1以上にすると、自然落下時に落下距離以上に反跳するため、収束せず発散してしまう ・物理エンジンのシミュレーション精度 値が大きいほど精度が上がるが、その分時間もかかる 10を指定するのがいいだろうとされている ・物理エンジン内の1mを画面上の何ピクセルとして表すかを設定可能(通常は1mが100ピクセル) Flashのサイズは、mxmlcで何も指定しなければ幅が500ピクセル,高さが375ピクセル 画面全体のサイズを幅5m,高さ3.75mにすると、1mが100ピクセル ・物理エンジン内のmxmlcで作られるFlashは通常は24フレーム/秒 1フレームで1/24秒だけ時間が進む ・物理エンジン内の計算は離散的に行われており、各点における計算結果をつなぎ合わせている ・計算間隔は、timeStepで設定されている ・timeStepにフレームの描画間隔をそのまま代入すると、計算結果がフレームレート依存になる timeStepをフレームの描画間隔にするのは、計算間隔が機種依存になるため、推奨されない timeStepは、固定の1/60秒にするのが無難 ・物理エンジン内部で制約付きの運動方程式を計算しているが、1回の計算で全ての制約を含めて完全に解くことはできない 理想的な解に近付けるため、方程式の解を方程式に再代入を何度も繰り返す(iterate) ・速度(velocity)の計算段階と、位置(position)の計算段階に分かれており、それぞれ計算を繰り返す回数を設定 計算を繰り返す回数が多ければ多いほどより理想的な結果が得られるが、計算が重くなる 速度フェイズ8回、位置フェイズ3回が推奨されている ・形状は、凸包(convex)しか扱うことができない 凸包とは、全ての角が外側に膨らんでいる多角形 非凸包とは、矢じりのように、内側に凹む部分を含む多角形 非凸包は、三角形などの形状を組み合わせて表現する必要あり ・多角形の頂点は、時計回りに設定する必要あり 頂点を反時計回りに設定すると不自然な動作となる ・多角形の頂点は、凸包となるように設定する必要あり ・物体は、全てBodyとして設定 ①静的 or 動的(staticBody or dynamicBody) ②位置(position) ③速度(linearVelocity) ④角度(angle) ⑤角速度(angularVelocity) ⑥質量(Mass) ⑦減衰率(linearDamping) ・物体の性質は、Fixtureとして設定 ①形(shape) ②密度(density) ③摩擦率(friction) ④反発係数(restitution) ・ContactListenerにより、衝突の検出、衝突の衝撃力の検出が可能 ・6種類のジョイントが使用可能 ①ディスタンスジョイント(DistanceJoint) 物体と物体を板で固定し、物体と物体の距離を一定に保つだけのジョイント ②回転ジョイント(RevoluteJoint) 物体と物体をピンでつなぎ、固定点を中心に回転させるジョイント ③直動ジョイント(PrismaticJoint) ピストンのような直線的な動きをするジョイント ④プーリージョイント(PulleyJoint) プーリーの役割を果たすジョイント ディスタンスジョイントの途中で方向を曲げたくなった場合に使用 ⑤ギアジョイント(GearJoint) 物体と物体をギアによってつなぐジョイント ⑥マウスジョイント(MouseJoint) マウスで物体を動かすためのジョイント ---- <リンク> ・Box2D v2.2.0 User Manual http://www.box2d.org/manual.html#d0e110 ・Box2D 2.2.1 マニュアルの日本語訳 – 第一章 http://www.enoie.net/blog/2013/06/box2d-2-2-1-%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3-%E7%AC%AC%E4%B8%80%E7%AB%A0/ ・Box2D 2.2.1 マニュアルの日本語訳 – 第二章 http://www.enoie.net/blog/2013/07/box2d-2-2-1-%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3-%E7%AC%AC%E4%BA%8C%E7%AB%A0/ ・ずっと君のターン:Box2Dflashのドキュメントが見つからないので仕方なしに訳す http://d.hatena.ne.jp/technohippy/20080203#1202009227 ・Box2Dの使い方 http://www.geocities.co.jp/SiliconValley/7406/tips/box2d/box2d_2.html http://www.geocities.co.jp/SiliconValley/7406/tips/box2d/index.html ・fslashtの日記:[Box2D] 2D物理エンジンを使ったみた (C#ソース付) http://slashdot.jp/~fslasht/journal/470540 ・物理エンジンBox2Dについて軽く調べた http://d.hatena.ne.jp/ir5/20091230/1262145672 ・Box2DでActionScript物理プログラミング http://gihyo.jp/dev/feature/01/box2d ・Box2D(Box2DFlashAS3)によるActionScript物理シミュレーション http://www.haphands.com/sw_flash/tech/box2d/ ・Box2DFlashAS3 の単純なサンプルと使い方 http://tech.nitoyon.com/ja/blog/2007/11/27/box2d-simple-sample/ ・Box2DFlashAS3 の単純なサンプルと使い方 (2.0.2版) http://tech.nitoyon.com/ja/blog/2009/04/28/box2dflashas3-2-0-2/ ・Cocos2d-xで学ぶBox2D超入門 http://cocoabu.com/box2d-00 http://cocoabu.com/box2d-01 http://cocoabu.com/box2d-02 http://cocoabu.com/box2d-03 http://cocoabu.com/box2d-04 http://cocoabu.com/box2d-05 ---- <その他のFlash向けの物理エンジン> ・APE(Actionscript Physics Engine) ActionScript向けの物理エンジン 最初からActionScriptで書かれている2D物理エンジン JavaやC++に移植されている ・WOW-Engine ActionScript向けの3D物理エンジン ----