物理エンジンについて


Game Maker Language リファレンス > 組み込み関数 用途別 > 物理エンジン > 物理エンジンについて

物理エンジン(Box2D)について

GameMaker:Studioでは、オープンソースである「Box2D」ライブラリを使用して、使いやすく広範な物理エンジンを実装しています。

 GameMaker:Studioは物理エンジンが統合されており、オブジェクトの衝突や相互作用をゲーム世界において、物理的な挙動のすべてをそれにより制御することができます。 "伝統的"な衝突システム(GameMaker:Studioが持つデフォルト機能)では、個々のオブジェクトが衝突をチェックして、それに反応するコードを記述する"反応性"システムとなります。 これは単純なゲームを作るためには充分ですが、このため様々な状況に反応するコードを記述しなければならないデメリットがあり、リアルな物理挙動を実装するには不十分な側面を持っています。

 物理エンジンは、通常の衝突は非常に異なる方法で動作します。 その方法とは、任意の衝突や相互作用が発生する前に、あらかじめ値を設定しておきます。 これはオブジェクトのプロパティを設定するのと同様に、ゲームの世界そのものの一連のプロパティを定義する"受動的"システムとなります。 これらのコード化された"ルール"は、すべてが対話する方法で管理します。 このように、いくつかの簡単なコードと正しい部屋のセットアップで、あなたは、オブジェクトと発生する世界との間の非常に複雑な相互作用を作成することができますし、一つ一つの可能な結果のためにコードを記述することなく解決します。

GameMaker:Studioの物理エンジンでは注意するべきことがいくつかあります:

  • 物理エンジンはGameMaker:Studioにおける概念(ルームの基本機能やインスタンス構造、ルームスピード、ステップなど)からは"隔離"した存在となっています
  • 物理エンジンは、通常のインスタンスの機能の多くを置き換えます。例えば、インスタンスが持つ"speed"や"direction"です。完全にシミュレートされた剛体を扱う場合、それを動かすためには"force(力)"や"impulse(衝動)"というパラメータを用います。この概念に慣れるには多少時間がかかり、ゲーム部分との統合するためには物理動作を把握する必要があります
  • 作成されるインスタンスの数、および物理学の世界が処理する必要のある衝突と衝突グループの数を制限する必要があります。 物理にはかなり集中的な計算が必要であるため、すべてが物理プロパティと衝突を伴う何千ものインスタンスを持つことはできず、可能な限りインスタンス数を制限するよう最適化が必要となります
  • 衝突システムでは、Box2Dが衝突を検出するためにインスタンスに割り当てることができる衝突ビットの数が限られているため、衝突を設定するときは、可能な限り親を使用してください。 たとえば、5つの異なる壁オブジェクトがある場合、5つの衝突をチェックするのではなく、親オブジェクトを作成して5つの壁に割り当ててから、親との1つの衝突チェックを行います。 オブジェクトの物理的特性は、衝突だけを継承するのではありません。 このようにして、ゲームを最適化し、エラーをなくすことができます
  • 物理関数を使用する以外の方法で、Roomのあるポイントから別のポイントにインスタンスを移動しないようにしてください(つまり、phy_position_x / phy_position_y による x / y座標を手動で設定しないでください)。 これは実行可能であり、状況によっては必要になる場合もありますが、特に衝突を解決しようとする場合、物理エンジンで予測できない結果が生じる可能性があるため、これは一般に回避する必要があります
  • フィクスチャはオブジェクトとインスタンスに個別にバインドできるため、フィクスチャをバインドするときは注意が必要です。 これは、フィクスチャを(たとえば)「o_Wall」にバインドすると、そのオブジェクトのすべてのインスタンスがフィクスチャを取得することを意味します。 フィクスチャを1つのインスタンスにのみバインドする場合は、適切な関数でそのインスタンスのIDを使用します
  • 浮動小数点の精度の違いにより、ターゲットプラットフォームごとにゲームのバージョンが、標準のWindowsバージョンとは微妙に異なる動作を示す場合がありますが、各バージョンは後続の実行で一貫性があることに注意してください
  • 物理シミュレーションの不安定さを防ぐために、Box2Dは、1回の更新でボディが回転および移動できる量を上限に制限します。 見かけの制限は、物理シミュレーションの精度、物理ワールドの更新回数と更新速度、および物理ワールドのスケーリングによって異なります。 これは、たとえば、ワールド更新速度が60の場合、最大移動速度は20になることを意味します

Box2Dマニュアル

Box2Dの基本オブジェクト

基本オブジェクトの定義を以下に記述します

オブジェクト名説明
シェイプ(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つのモジュールで構成されている

  1. 共通モジュール
    • メモリ計算
    • 数値計算
    • 各種設定
  2. 衝突モジュール
    • シェイプ定義
    • 衝突判定関数
    • 衝突問い合わせ
  3. 力学モジュール
    • 物理ワールド
    • 剛体
    • フィクスチャ
    • ジョイント

単位

Box2Dは浮動小数点の誤差も許容する範囲で動作する。特にBox2Dは0.1m〜10mの物体の動作について適切となるように調整されている。静的物体であれば50mまでの大きさであれば大きなトラブルもなく動作する。

単位としてピクセルを使用したい誘惑にかられるが、不幸にもこれは貧弱なシミュレーションとあやしい振る舞いの原因となる。200ピクセルの物体はBox2Dでは45階建てのビルとみなされる。(※Box2Dの物理ワールドの単位にピクセルを使用せずに、変換処理を通してスクリーンに描画するのが良い)

角度の単位としてはラジアンを使用する。剛体の回転はラジアンで配置され、上限なしで大きくなる(つまり2πラジアン以上になっても0に戻らず、値が増えていく)。角度の大きさが非常に大きくなる前に(b2Body::SetAngleを使用して)正規化する(0〜2πの間に値をおさめる)ことを考えること

Wiki内検索

#search(): You already view a search box

MENU

ドキュメント

GMLリファレンス

2ch

その他



最新の30件

2021-01-23 2021-01-22 2021-01-21 2021-01-19 2021-01-18 2021-01-17 2021-01-16 2021-01-15 2021-01-14 2021-01-13

人気の10件

今日の10件



これまでの訪問者: 3124
今日の訪問者: 1
昨日の訪問者: 1
閲覧者: 3