[GameMaker: Studio] Physicsのおさらい・その1

GM:SPhysics(物理演算エンジン)Box2Dをベースにしたものが採用されています。
ほぼBox2Dと同等なので、GM:S以外でBox2Dを経験している方は特に悩むことなく使えているかと思います。

しかし、GM:S公式の説明は結構大雑把で、物理エンジンを初めて触った方は基本的な設定でさえ迷うかもしれません。

そこで何回かに分けてGM:SにおけるPhysiscsの基礎となる部分を解説してみたいと思います。


gms_phy_001

roomphysicsタブにある“Room is Physics World”をオンにすると、そのroomのインスタンスの「動きと当たり判定」は物理演算が使用されるようになります。

動きだけではなく当たり判定も物理演算に置き換わるという点に注意してください。
当たり判定を持たせたいオブジェクトはPhysicsオブジェクトにする必要があります。

さて、ここでの設定はGravityPixels To Metersの2つだけと、とてもシンプルです。
この2つの初期値はX:0.0/Y:10.0/PtM:0.1ですが、実はこの数値にはちゃんとした意味があります。


まずPixels To Metersですが、これは「物理世界の1メートルはゲーム上では何ピクセルか?」という設定になります。

PtM:1であれば1メートルは1ピクセルになります。
PtM:0.1は1メートルは10ピクセル(1/10=0.1)ということで、画面上で10ピクセル落下したら1メートル落ちたということですね。


次にGravityですが、これはその名の通り重力方向を示しています。
初期値はXが0.0でYがプラス方向に10.0なので、真下に向かって10の力が働くということですね。

この数値は「1秒間に何メートル移動する力をかけるか?」という意味で、PtM:1/Gravity Y:10なら、「1秒間に10ピクセル落下する」となります。

PtM:0.1/Gravity Y:1では「1メートル=10ピクセル」なので、見た目上は同じくに「1秒間に10ピクセル落下」します。

初期値のPtM:0.1/Gravity Y:10では「1秒間に100ピクセル(10メートル)落下する」ということになります。


これらの初期値は地球の重力にほぼ等しい(若干強めですが)設定だということを覚えておいてください。
Gravityは基本的に「98*PtMの値」で地球上の設定になります。

身長180cmのキャラクターを縦64ピクセルで描いた場合、100/180*64=35.6で1メートルは大よそ36ピクセルになりますから、1/36でPtM:0.03になります。
Gravity Yは98*0.03=2.9を設定します。

月の重力は地球の約1/6=大よそ0.17なので、「98*0.17*PtMの値」とすることで、月面を舞台としたゲームを作ることができます。


ここまでの地球上での設定例は、数値こそ違えど単純落下していく見た目はほとんど同じです。

では何故わざわざ計算してまで設定を変えるのかというと、1ピクセル辺りの重みが変るため、オブジェクトの質量や反発といった計算に影響があるためです。

gms_phy_002gms_phy_003

この2つはどちらもオブジェクトの設定は全く同じで、右からボールをヒットさせた後の画像です。
左はPtM:0.1/Gravity Y:9.8、右はPtM:0.03/Gravity Y:2.9で実行しています。
全く同じオブジェクト設定でも、roomの設定でこれだけの違いがあります。

Physicsを使っていて「何か動きが現実離れしていておかしい」と感じたら、GravityPixels To Metersの設定を見直してみるのもいいかもしれません。