Nape: Box2D との異なる点のメモ
物理演算ライブラリ Nape において、Box2D とは異なる点・つまずいた点をメモします。ActionScript3.0 で利用できた Box2D v2.1a との比較となります。
「延々と同じ高さで跳ねる物体」を作るには Space.worldLinearDrag を 0 にする
Box2D では各物体に対する摩擦係数(friction)を0, 反発係数(restitution)を1 にすることで、延々とほぼ同じ高さで跳ねる物体を設定する事ができました。
Nape では空間に対してデフォルトで空気抵抗値のようなもの(Space.worldLinearDrag)が微量設定されており、この値を 0 にしないと「延々と同じ高さで跳ねる物体」を表現する事ができません。
space = new Space(gravity); space.worldLinearDrag = 0;
参考)
Nape Space クラス
http://napephys.com/docs/types/nape/space/Space.html
Nape調査: すべての物体を完全弾性かつ抵抗は0に設定していても、ボールがゆっくり減速する?
https://github.com/CreateSomethingWithStarling/HagiBreakout/issues/26
Box2D b2RevoluteJoint を Nape で再現するには複数 Joint を組み合わせる
Box2D b2RevoluteJoint とはどういう動作なのか、以下のサイトが参考になります。
参考) b2RevoluteJointDef で回転ジョイントを作る
http://flashjp.com/api/box2d_b2RevoluteJointDef.php
Nape では AngleJoint を利用すれば、b2RevoluteJoint と同じような事ができそうな事がわかります。b2RevoluteJoint と同じく回転角度の限界値を設定可能な jointMax, jointMin プロパティが用意されています。
参考)Nape AngleJoint クラス
http://napephys.com/docs/types/nape/constraint/AngleJoint.html
しかし AngleJoint では 物体をどこか座標にとどめておくことができないため、更に PivotJoint クラスを利用します。
まず Nape Joint サンプルページを見てみると、以下の様なソースコードがある事がわかります。
参考) Nape Joint サンプルページ
http://napephys.com/samples.html#swf-Constraints
Nape Joint サンプルページ内 Haxe ソースコード一部引用
var pin = new PivotJoint(space.world, body, body.position, Vec2.weak(0,0));
PivotJoint コンストラクタの第一引数に Space.world を指定する事で、空間内特定座標(body.position)に BodyType.DYNAMIC な物体(body)をピン止めするイメージとなります。
上記から、Box2D b2RevoluteJoint を Nape で表現するには以下の様なソースコードを記述すればよしとなります。
var pivotJoint = new PivotJoint(space.world, body, anchor1, anchor2); space.constraints.add(pivotJoint); var angleJoint = new AngleJoint(space.world, body, ANGLE_MAX, ANGLE_MIN); space.constraints.add(angleJoint);
注意点: Body ローカル座標内 アンカーまでの距離に注意
言葉で説明するのは難しいですがメモ書きとして。
画面での見た目上 同じような Joint 設定でも、body を構成する物質のローカル座標位置や anchor までの距離によって回転速度が異なってきます。どうも回転速度がおかしいと思われる場合は、ローカル座標(0, 0) からアンカーまでの位置を調整すると解決するかもしれません。
その他メモ
・物体ピクセル移動では Body.position.add ではなく Body.position.addeq を利用すると良し
Body.position.add は加えた値を適用した Vec2 が返却されるだけ?なのに対し、Body.position.addeq は Body.position の値が直接書き換わる模様
・重力に逆らってピクセル移動する物質に、自由落下する物質が正面衝突すると、互いがピッタリと吸い付く妙な動作になる
衝突時のイベントを調査して、反射する等の処理を組み込む必要あり
・メモリに関して気になる記述
http://docs.tatsuya-koyama.com/dev-log/adobe-air-tools/
Adobe AIR 以外をターゲット(OpenFL等)にした時や、現在の Nape のバージョンでもそうなるかは不明
[ FLASH ] [ FLASH ] [ tips ] 投稿者 siratama : 2014年08月17日 14:36