物理エンジンについて


物理エンジン

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

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

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

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

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

  • 物理エンジンはGameMaker:Studioにおける概念(ルームの基本機能やインスタンス構造、ルームスピード、ステップなど)からは"隔離"した存在となっています
  • 物理エンジンは、通常のインスタンスの機能の多くを置き換えます。例えば、インスタンスが持つ"speed"や"direction"です。完全にシミュレートされた剛体を扱う場合、それを動かすためには"force(力)"や"impulse(衝動)"というパラメータを用います。この概念に慣れるには多少時間がかかり、ゲーム部分との統合するためには物理動作を把握する必要があります
  • You should limit the number of instances that are created, as well as the number of collisions and collision groups that the physics world has to deal with. You cannot have thousands of instances, all with physical properties and collisions and expect everything to work fine due to the fact that physics requires some pretty intensive calculations, so limit yourself and optimise where possible.
  • When setting up collisions, use parents as much as possible since the collision system has a limited number of collision bits available to assign to instances for Box2D to detect collisions. For example, if you have five different wall objects, don't check for five collisions, rather, create a parent object and assign it to the five walls then have ONE collision check with the parent. The physical properties of the objects are not inherited only the collisions. In this way you can keep your game optimised and error free.
  • Try not to move instances from one point of the room to another in any way other than using the physics functions (ie: do not set the x/y coordinates manual). Although this can be done and in some circumstances it may be necessary, this is generally to be avoided due to the unpredictable results that it may have on the physics engine, especially when trying to resolve collisions.
  • Care should be taken when binding fixtures, as they can be bound to objects and instances independently. This means that if you bind a fixture to (for example) "o_Wall", all instances of that object will get the fixture. If you only want to bind a fixture to one instance, then use that instance's id in the appropriate function.
  • Please be aware that due to differences in floating point precision you may find that versions of your game for different target platforms may exhibit subtly different behaviour to the standard Windows version, though each version will be self-consistent across subsequent executions.
  • To prevent instabilities in the physical simulation Box2D constrains to upper limits the amount a body may rotate and translate within a single update. The apparent limitations will vary according to the accuracy of the physical simulation in accordance with the number of updates and update speed of the physics world, and also in accordance with the physics world scaling. This means that (for example) if you have a world update speed of 60, the maximum movement speed would be 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件

2019-07-28 2019-07-12 2018-11-17 2017-11-07 2017-10-26 2017-10-01 2017-05-13 2016-10-01 2017-01-22 2017-01-14 2016-12-25 2016-10-09 2016-09-21 2016-08-29 2016-06-21 2016-02-23 2016-02-10 2016-01-18 2015-10-30 2015-10-20 2015-06-23 2015-06-20 2015-06-19 2015-06-10 2015-06-09 2015-06-07

人気の10件

今日の10件



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