各ソフトウェア毎に異なる物理エンジンの仕様について


20 Events ゲームコンペへエントリーするにあたって CF25 の物理動作 (Physics=Box2D) を色々使ってみた。

使っていくうちに気がついたのだけど、CF25 は物理動作を適用したオブジェクトに対してオブジェクト位置変更も座標指定から同時に実行できてしまう。

普通は物理エンジンの動作をオブジェクトに適用した場合、通常のオブジェクト位置指定命令は無効化される、もしくは位置指定の方を優先実行して物理動作をリセットする。つまり優先実行される順番が決まっていて両方共実行されることはない、とそう思っていた。

しかし CF25 は物理動作と物理動作を無視した座標による位置指定を同時に実行できてしまう。果たしてこの仕様は CF25 固有の仕様なんじゃないかと思い、他開発ソフトを使って動作比較してみた。

Box2D について

まずゲーム用の 2D 専用物理エンジンは chipmunk もあるけど、基本的に Port しやすいのか各開発ソフトで標準的に利用されているのが Box2D。

物理エンジンという以上ある程度は一般的な物理の法則と同じ振る舞いをするわけで、しかもエンジンが同じなら異なったソフトでも単純な動作だったら近似的な結果、つまり同じような動作は作れるはず、と考えた。

比較対象となるソフト一覧

  • Construct2 (C2)
  • ClickteamFusion2.5 (CF25)
  • GameMaker:Studio1.4 (GMS)

それぞれ物理が付いているのでちょうどいいから上記三つで動作を試してみる。

結果:三者三様

いろいろすっ飛ばすがとりあえず結果から。

物理動作中に座標指定による座標変更も同時に実行できてしまうのは CF25 以外に無かった。

C2 と GMS は排他的に処理されるためどちらかが無効化される。ただし CF25 は物理と座標変更を同時に実行することで最終的にバグ動作を生み出すのでやはり同時実行するべきではない(できてしまう方がそもそも問題と考える)。

C2 の場合は物理動作をしているオブジェクトに対して座標位置指定による座標変更処理を混ぜると、強制的にそのオブジェクト・インスタンスに対する物理動作は一旦無効化され、ついでに加速度とか諸々リセットされる。物理動作中に座標位置指定すると座標位置指定処理が物理より優先される例。そしてまた新しい位置から物理動作計算をやり直すという仕様。

GMS の場合は物理動作を指定したオブジェクト・インスタンスに座標指定による変更を試みても座標指定自体が無効化される。つまり物理動作中は座標指定による変更を受け付けなくなる。物理を指定したら物理動作が優先され、位置指定による変更を無視する例。

例えば X 方向への等加速運動はどう処理すべきか

物理で落下中のオブジェクトに対して任意のタイミングで X 位置を変えるような処理は基本的に座標指定ではなく Force をなどを利用すべき。Force を利用した場合は CF25 も C2 も GMS も同じような動作を作ることができる。

CF25 の特異性

CF25 の物理は座標指定も同時実行できてしまう時点で物理法則的におかしい。だができてしまう。つまり排他処理が無い。同時実行してるとやがてバグ的な動作を生み出す原因ともなる。

他ソフトでは排他的動作なので少なくとも混ざることは無い。つまりシミュレーション的な齟齬が生じ難い。

Static (静的)と Density(質量)

Density(質量)を 0 にすることで Static を作ることができるのは唯一 GMS だけだった。

Density=質量が 0 だから物理の影響を受けなくなる。GMS 同様に Box2D の ActionScriptPort は Density が 0 の場合たしか物理の影響を受けない。

C2 と CF25 は Density を 0 にしてもオブジェクトは重力の影響を受けて落下するため(なんで?)、違和感が残る。C2 はオプションから選択すれば Static にできるが、CF25 は別動作という扱いで Physics – Background という動作を選択させる。

コリジョン検出の違い

C2 は物理動作を適用すればオブジェクト同士の衝突まで含めた全てが自動で動く。C2 の物理動作の実装が一番一般ユーザ受けすると思う。だって設定すればこれ勝手に全部動くし、物理動作を無視した座標指定移動命令 ( Viewport 基準の Wrap 動作も含む) があった場合は強制的に物理動作はリセットされるから安全だ。

CF25 は排他的処理をしないけれどこの時点ですでに物理的挙動としておかしいし、同時に命令を実行し続けるといずれバグ動作を生む。そして衝突は自分で指定しなければいけない。異なったオブジェクトとの衝突は逐一指定が必要になる。衝突判定は手動なので案外メンドクサイ。

GMS は物理が指定された場合、物理動作は優先度が高く処理され、コリジョンは Parent – Children による階層的な指定ができたり、一旦作り始めるとやはり一番細かく動作を追求できる。

同じ Box2D 使っていてもツールごと実装には個性があって、しかし排他的ではない分 CF25 だけ仕様が独特というか危なっかしい。

CF25 だけに依存して物理動作として物理触っていると、経験値が偏る気がしました。


Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です