メインコンテンツまでスキップ

物理

物理を使うと、オブジェクトが落ち、ぶつかり、弾みます。ここでは、何が固体になるか、衝突形状がどこから来るか、物理オブジェクトをどう動かすかを説明します。

ほとんどは自動で動きます。床は設定しなくても固体で、dynamic にしたオブジェクトは落下します。

何が固体として扱われるか​

オブジェクトは、リジッドボディを付けたときに固体になります。また、形があり、ツリーの上の階層にあるボディにまだ含まれていないときも固体になります。つまり、床にぶつかって止まるのは、それが床だからです。わざわざ印を付ける必要はありません。

オブジェクトは次のように確認します。

オブジェクトにあるもの結果
リジッドボディそれ自体が 1 つのボディになります
None に設定したリジッドボディ子も含めて、ここにあるものはどれも固体ではありません
コライダー(見えないものも含む)固体
ジオメトリがあり、表示されている固体
ジオメトリはあるが、非表示固体ではない
上のどれもない(グループ、ライトなど)固体ではない

ここから、覚えておくと便利なルールが 2 つあります。

  • コライダーは、見えなくても固体のままです。 見えない壁はこうしてつくります。コライダーを追加し、ジオメトリは付けません。見る人はぶつかりますが、何も見えません。
  • ジオメトリが固体になるのは、表示されている間だけです。 飾りの形を非表示にすると、ものをふさがなくなります。
ボディの一部を非表示にしても、ボディからは外れません

一度大きなボディに加わった形は、非表示にしてもボディに残ります。外したいときは、そのオブジェクトを削除するか、リジッドボディを None に設定してください。

衝突形状​

オブジェクトにコライダーがあれば、物理はそれを使います。なければ、エンジンがジオメトリから形をつくります。

ジオメトリ衝突形状
box、sphere、cylinder、capsule、cone対応する同じ形
3 種類の多面体外形を正確に包む形
plane、circle、ring、triangle両面から固体になる薄い板
torus輪に近い形
extrude、latheメッシュにぴったり沿う形
読み込んだ 3D モデルなし。下を参照してください
読み込んだモデルは、コライダーがないと固体になりません

物理でいちばんよくある落とし穴です。GLB モデルをシーンに置いて dynamic にすると、ワールドをすり抜けて落ちていきます。コライダーを追加すれば正しく動きます。ほとんどの場合、box か capsule で十分です。

メッシュにぴったり沿う形は、動かないものだけに使ってください

メッシュ形状(extrude、lathe、読み込んだジオメトリからつくる形)は、動かない床や壁なら問題ありません。動くオブジェクトに使うと、ものをすり抜けたり、ガタガタ震えたりします。代わりに box、sphere、capsule、cylinder を使ってください。単純な形のほうが、処理もずっと速くなります。

オブジェクトを拡大・縮小すると、衝突形状も一緒に拡大・縮小されます。

物理オブジェクトを動かす​

dynamic なボディの位置を設定しても、何も起きません

dynamic なボディの位置は、物理が決めます。変更しても次のステップで上書きされるので、無視されたように見えます。

  • ボディを押したいときは、インパルスか力を使います。
  • ボディを別の場所に置きたいときは、テレポートを使います。復活、チェックポイント、スタート地点に戻すときなどです。

スクリプトでは ctx.physics.teleport(...) と ctx.physics.applyImpulse(...) を使います。ctx リファレンスを参照してください。歩くキャラクターには、ゲーム操作を使いましょう。こうした処理をすべて任せられます。

オブジェクトの移動速度の読み取りは軽い処理ですが、値は 1 フレームほど遅れています。「動いているか」の確認には向いていますが、正確な計算には向きません。

ワールドの設定​

重力、摩擦と弾みやすさの初期値、ソルバーの精度は、プロジェクトで設定します。スペースごとに上書きすることもできます。変更はすぐに反映され、再起動は要りません。

摩擦と弾みやすさは、ボディごとに上書きできます。何も変えなければ、ボディはワールドの設定を使います。

衝突​

2 つのオブジェクトが触れると、両方に on-collide イベントが届き、それぞれ何にぶつかったかがわかります。イベントでは、特定のオブジェクトだけに絞ることも、どのオブジェクトでも反応するようにしておくこともできます。

衝突は親に伝わりません

タップは親オブジェクトに伝わりますが、衝突は伝わりません。実際に触れたオブジェクトでだけ発生します。イベントは、ぶつかる側のオブジェクトに付けてください。

物理が動く場所​

  • ブラウザ:動きます。
  • AR Clip アプリ(モバイル):動きます。
  • エディター:動きません。作業中に何かが落ちることはありません。

プロジェクトを実行したとき、物理はシーンが必要とする場合にだけ起動します。必要になるのは、シーンに dynamic か kinematic なもの、ゲーム操作、またはボディとスクリプトの組み合わせがあるときです。static なオブジェクトしかないシーンは物理を必要としないので、そのぶん速く開きます。

セッションの途中でスクリプトがボールをつくれば、その時点で物理が起動します。


次へ: ライト — ライトの種類と、トランジションでなめらかに変わる設定。