2008年5月アーカイブ

前回まででBox2Dの基本的な部分は出来たけど、今回はより掘り下げて、オブジェクトの3つの基本的なプロパティ「friction」「restitution」「density」について調べてみた。

まずはfriction

b2ShapeDefのソースを覗くと「The shape's friction coefficient, usually in the range [0,1].」とあるから「摩擦係数」のことで「0〜1の値」で指定するのが普通らしい。
昔習った様な気がするけどもう完全に忘れてる、、

調べてみるとどうやら、2つの物体間の摩擦力を決める係数みたい。
でさらに「静摩擦係数」「動摩擦係数」という2種類があって、「静摩擦係数」は静止している物体同士の間に発生する摩擦力(静止摩擦力)に対する係数で、「動摩擦係数」はどちらか(または両方)の物体が動いている際に発生する摩擦力(動摩擦力)に対する係数だそうだ。
そして2つの物体の材質によっても変化し(木、氷、鉄など)、また物体が濡れているか乾燥しているかによっても変わってくる。

ということは、衝突判定に、局所毎にfrictionを変化させる処理を入れなきゃいけないのか、、
そんなことをするとFlash側の処理も大変になるだろうし、なにより自分が大変だ。
という事で、材質毎に平均値で決めてしまうのが良いかなと思った。

↓平均値を求めるにはここのページが参考になるかな。

Coefficients Of Friction

めんどかったから大体の値(と自分の中での思い込みも混ぜた)で、、
「鉄:0.6、アルミニウム:0.6、ゴム:0.9、木:0.5、コンクリート:0.7、氷:0」

ん〜物理、、

次はrestitution

ソースには「The shape's restitution (elasticity) usually in the range [0,1].」とあるから、弾力(弾性)のこと。
これは調べてもなかなか思ったものが無かったからfrictionと同様に「0〜1の値」で勝手に決めてみた。
「鉄:0.2、アルミニウム:0.3、ゴム:0.9、木:0.3、コンクリート:0.1、氷:0.1」

こんなもんか

最後にdensity

ソースでは「The shape's density, usually in kg/m^2.」とある。
密度のことらしいけど立法メートルではなく平方メートルになっている。これは「面積密度」と言うみたい。
1m^2当たりの物体の質量を入れる。(オブジェクトの重さは、大きさ×densityになってるっぽい)
ということで、↓このあたりを参考にさせていただくと、

数量の比較 (密度)
MSN 相談箱 | 天然ゴムの密度は?
木ってどうなっているの?

「鉄:7.9、アルミニウム:2.6、ゴム:0.4、木:1.4、コンクリート:2.4、氷:1」

だろうかね。

で、これを自作クラスに反映させてみたら、ボディーが重すぎて沈んだ。。
↓クラスはこんな感じで設定した。 色々さぐったら、restitutionJointにも影響してるみたいで、車のボディとタイヤを繋ぐJointに、タイヤのrestitutionが思い切り反映されてしまっていて、クタるみたい。
解決策として、タイヤの中心にアルミのオブジェクトを追加した。まだちょっとクタるけど、まぁ動くから良いか。。

ソース(結構Classをいじってしまった)

まだまだだな、、

今回は、前回のエントリーまでで作った車のボディーと、前回説明は省いてたけど画面中央にいる障害物の衝突判定をメモ。
↓ここを参考にさせていただいた。


Flash OOP Japan | 続Flah OOP本 | 物理エンジンを使ったゲーム | あたり判定


b2Bodyオブジェクトにはm_contactListという、衝突している2つのオブジェクトを格納するプロパティが存在する。
まずは、車のボディー(bodyBody)のm_contactListから、衝突しているオブジェクトを取り出す処理を入れる。(m_contactListを取得するにはGetContactList()を使用する)


衝突するオブジェクトは、地面であったり壁であったりと場合により変わるので、それを判断する指標が必要になってくる。
その指標を、b2PolygonDefb2CircleDefで指定したグラフィックデータ(userData)のプロパティ「id」として設定する。(ここでは車のボディには「body」、障害物には「obstacle」というidを指定)
で、上の方で取得したm_contactList内のオブジェクト、「obj1」と「obj2」のuserDataidがそれぞれ、「body」と「obstacle」だったら衝突時のアクションを起こすという流れになる。

あとここでつまづいたのが、「idだけで判定しようとするとオブジェクトの矩形で判定をしてしまう」ということ。
ここでb2ContanctGetManifoldCount()を調べる。
GetManifoldCount()は「0」か「1」の数字が取得できて、「“0”の時は矩形で衝突している」、「“1”の時はオブジェクトの形で衝突している」事を表しているみたい。
↓それをコードに組み込むとこんな感じ。

↓今回は衝突時に右上のボックスが「TRUE」、非衝突時が「FLASE」の文字を表示する様にしてみた。
This site requires flash player 9 or later.Thank you.


ソース

とりあえず今回までの事が理解出来れば簡単なゲームは作れそうな気がする。
でも、まだ探ってない部分が沢山あるから、まだまだ勉強しなくては。

車のグラフィックにJointを設定してみる。

前回のエントリーで挙げたb2DistanceJointb2RevoluteJointを使って車をつなげる。
本当はサスペンションのグラフィックも作って本格的につなげたいところだけど、あまりJointを多く作るとかなりメモリを消費するみたいだから、簡易的なつなげ方にしておく。

Jointのつなげ方と種類は↓この図の様にする。

getdefinitionbyname.gif Jointでつなげたオブジェクト同士は、デフォルトで衝突しなくなる。
衝突させたい場合はcollideConnectedというプロパティをtrueにする。
この車の場合、衝突させてしまうとビクビクしてしまうのでデフォルトのfalseのままにしておく。

ついでに矢印キーの右を押すと前進し、左でバックする機能も入れてみた。
実際の挙動が↓これ。

This site requires flash player 9 or later.Thank you.


大分コードが長くなってきたからClassにまとめられる部分はまとめた。

ソース

次は衝突判定でもやってみようかな。

車のグラフィックにJointを設定する前に、Jointの種類と使い方のメモ。

Jointは大きく分けてb2DistanceJointb2RevoluteJointb2PulleyJointb2PrismaticJointの4種類。
どのJointの設定も基本的には同じで、2つのBox2Dオブジェクトを指定して繋げる感じ。

以下個々の説明。

- b2DistanceJoint -
これは2つのオブジェクトの距離を一定に保つJoint

This site requires flash player 9 or later.Thank you.


scriptはこんな感じ。

- b2RevoluteJoint -
モーターの機能がついていて、motorSpeedというプロパティに値を与えるとオブジェクトが回転する。

This site requires flash player 9 or later.Thank you.


- b2PulleyJoint -
滑車のような動きをさせられる。

This site requires flash player 9 or later.Thank you.


- b2PrismaticJoint -
単体では変な動きをするから、Box2DFlashAS3のサンプルにあったものを焼きなおしてみた。

This site requires flash player 9 or later.Thank you.

長くなってしまうから一つ一つソースにまとめてみた。

ソース

次回は車のグラフィックにJointを設定してみる。

今まではデバッグモードでの動作だったけど、Box2Dオブジェクトにグラフィック素材を反映してみる。
とりあえず車を作ってみよう。

まずはグラフィック素材の準備。
↓こんな感じでパーツ毎に絵を作成しムービークリップにしておく。(ピンクはBox2Dオブジェクトの形)
getdefinitionbyname.gif BODY部分のBox2Dオブジェクトは形が複雑なので一部簡略化してオブジェクトを作成する。(BODY下部のタイヤ部分は衝突判定が甘くても良いかと思ったから直線にしてみた)
基本的にどのパーツもオブジェクトに反映するやりかたは一緒だから、代表してBODYの例を挙げてみる。 あと、グラフィック素材の座標や回転も毎フレーム描画し直さないといけないから、前に書いたUpdate関数の中に↓これを入れておく。 ↓全部のパーツを作ったサンプルとソース。

サンプル
ソース

次回はオブジェクト同士を繋ぎあわせるJointの設定の仕方をやってみよう。

 1  |  2  next