Game Maker Language リファレンス > 組み込み関数 用途別 > 物理エンジン > 物理エンジンについて
GameMaker:Studioでは、オープンソースである「Box2D」ライブラリを使用して、使いやすく広範な物理エンジンを実装しています。
GameMaker:Studioは物理エンジンが統合されており、オブジェクトの衝突や相互作用をゲーム世界において、物理的な挙動のすべてをそれにより制御することができます。 "伝統的"な衝突システム(GameMaker:Studioが持つデフォルト機能)では、個々のオブジェクトが衝突をチェックして、それに反応するコードを記述する"反応性"システムとなります。 これは単純なゲームを作るためには充分ですが、このため様々な状況に反応するコードを記述しなければならないデメリットがあり、リアルな物理挙動を実装するには不十分な側面を持っています。
物理エンジンは、通常の衝突は非常に異なる方法で動作します。 その方法とは、任意の衝突や相互作用が発生する前に、あらかじめ値を設定しておきます。 これはオブジェクトのプロパティを設定するのと同様に、ゲームの世界そのものの一連のプロパティを定義する"受動的"システムとなります。 これらのコード化された"ルール"は、すべてが対話する方法で管理します。 このように、いくつかの簡単なコードと正しい部屋のセットアップで、あなたは、オブジェクトと発生する世界との間の非常に複雑な相互作用を作成することができますし、一つ一つの可能な結果のためにコードを記述することなく解決します。
GameMaker:Studioの物理エンジンでは注意するべきことがいくつかあります:
基本オブジェクトの定義を以下に記述します
オブジェクト名 | 説明 |
シェイプ(Shape) | 円や多角形のような2Dオブジェクト |
剛体(right body) | 非常に硬く、2体の距離が完全に一定であるような物質の塊。ダイアモンドのように硬い |
フィクスチャ(fixture) | フィクスチャはシェイプを剛体に結びつけ、さらに密度・摩擦・復元力などの属性を追加したもの |
制約(constraint) | 制約は剛体から自由度を削除するための物理的接続のことである。2Dでは剛体は3つの自由度(2つの移動単位と1つの回転単位)を持っている。もしあるボディを取り上げ(振り子のように)壁にピンで止めたなら、ボディを壁に制約したことになる。この時点でボディはピンの周りを回転することしかできず、2つの移動自由度を制約したことになる |
接触制約(contact constraint) | 剛体の貫通を防ぎ、摩擦・復元力をシミュレートするために設計された特殊な制約である。接触制約は開発者は作成することはできない。Box2Dによって自動的に作成される |
ジョイント(joint) | 2つ以上のボディを互いに保持するための制約である。Box2Dはいくつかのジョイントタイプをサポートする:回転・直動・距離など。ジョイントは制限とモータを持っているものもある |
ジョイント制限(joint limit) | ジョイント制限はジョイントの動作範囲を制限する。例えば人間のヒジの一定の角度の範囲でのみ(動作を)許されている |
ジョイントモーター(joint motor) | ジョイントモーターは関節の自由度に従って結合された剛体を動かす。例えば、モーターを使ってヒジを回転できる |
物理ワールド(world) | 物理的なワールドは「剛体」「フィクスチャ」「相互に作用する制約」の集合である。Box2Dでは複数のワールド生成をサポートしているが、通常必要性はなく、望まれる状況もない |
ソルバー(solver) | 物理ワールドは時間を進め、接触および関節制約を解決するためのソルバーを持っている。Box2DソルバーはN回の制約を操作する非常に高速な繰り返しソルバーである |
継続的な衝突(continuous collision) | ソルバーは離散時間で剛体の処理を進める。介入なしでこれはトンネリングを招く。Box2Dはトンネリングを扱うための特別なアルゴリズムを含んでいる。まず衝突アルゴリズムは最初の衝突時間を見つけるために2つの剛体間の動作を補完することができる。次に、最初の衝突時間まで剛体を移動させ衝突を解決する副ソルバーがある |
Box2Dは3つのモジュールで構成されている
Box2Dは浮動小数点の誤差も許容する範囲で動作する。特にBox2Dは0.1m〜10mの物体の動作について適切となるように調整されている。静的物体であれば50mまでの大きさであれば大きなトラブルもなく動作する。
単位としてピクセルを使用したい誘惑にかられるが、不幸にもこれは貧弱なシミュレーションとあやしい振る舞いの原因となる。200ピクセルの物体はBox2Dでは45階建てのビルとみなされる。(※Box2Dの物理ワールドの単位にピクセルを使用せずに、変換処理を通してスクリーンに描画するのが良い)
角度の単位としてはラジアンを使用する。剛体の回転はラジアンで配置され、上限なしで大きくなる(つまり2πラジアン以上になっても0に戻らず、値が増えていく)。角度の大きさが非常に大きくなる前に(b2Body::SetAngleを使用して)正規化する(0〜2πの間に値をおさめる)ことを考えること