この記事のURL

http://www.dango-itimi.com/blog/archives/2014/001221.html


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

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1181

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]