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

物理

物理は使いたいときだけ動き、ほとんどは自動です。頼まなくても床は固く、dynamic と印を付けたものは 落ちます。以下のルールは、期待どおりに動かない 2〜3 の場面を説明します。

何が「固い」とみなされるか

rigid body を与えたもの、あるいは形を持っていて、その上のどれもまだ名乗り出ていないものが 固くなります。床が人を止めるのは、それが床だからです。印を付け忘れる心配はありません。

オブジェクトから上に向かって見ていくと、こうです。

オブジェクトが持つもの結果
rigid bodyそれ自体が 1 つのボディ
none に設定された rigid bodyここは子も含めて何も固くありません
collider(見えないものでも)固い
ジオメトリがあり、表示されている固い
ジオメトリはあるが、隠されている固くない
上のどれでもない(グループ、ライト)固くない

ここから 2 つのことが導かれ、どちらも役に立ちます。

collider があるのは意図した証拠なので、見えなくても固いままです。 見えない壁はまさにこう 作ります。collider だけ置き、ジオメトリは置かない。来場者は何もないところにぶつかります。

ジオメトリが固いのは、見えている間だけです。 飾りの形を隠せば、何かを止める力もなくなります。

組み上がったボディの一部を隠しても、ボディからは外れません

いったん大きなボディに加わった形は、隠しても中に残ります。外したいときは、オブジェクトを削除するか、 その rigid body を none にしてください。

衝突の形はどこから来るのか

collider を与えれば、それがそのまま使われます。なければ、エンジンがジオメトリから形を割り出します。

ジオメトリできるもの
box・sphere・cylinder・capsule・cone対応する形
3 種類の多面体正確な凸包
plane・circle・ring・triangle薄い両面の板
torus重なり合う球のリング
extrude・lathe正確なメッシュ形状
読み込んだ 3D モデルなし。下を参照
読み込んだモデルは、collider を与えるまで固くありません

物理でいちばん多い驚きが、圧倒的にこれです。GLB をシーンに置いて dynamic にすると、世界を すり抜けて落ちていきます。collider を足せば — box か capsule でほぼ正解です — きちんとふるまいます。

正確なメッシュ形状は、決して動かないもののためのものです

メッシュ形状(extrude・lathe・読み込んだジオメトリ由来)は、静止した床や壁には問題ありません。 動くものに使うと、ほかのものをすり抜け、震えます。box・sphere・capsule・cylinder を使ってください。 単純な形ははるかに高速でもあります。

スケールは形に焼き込まれるので、オブジェクトを拡大縮小すれば、衝突する相手も同じように変わります。

物理ボディを動かす

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

dynamic なボディの位置は物理が所有していて、次のステップであなたの変更を上書きします。 エディターに無視されているように見えます。

動かすにはインパルスフォースを、どこかに置くにはテレポートを使ってください。 リスポーン、チェックポイント、「最初に戻る」に使います。

script では ctx.physics.teleport(...)ctx.physics.applyImpulse(...) です。 → ctx のリファレンス 歩くキャラクターが欲しいなら、ゲーム操作がこれらを すべて引き受けてくれます。

速度の読み取りは軽く、1 フレームほど遅れます。「いま動いているか?」には最適ですが、正確な計算には 向きません。

ワールドの設定

重力・既定の摩擦・反発・ソルバーの品質はプロジェクト単位で設定し、space ごとに上書きできます。 変更は即座に反映され、再起動は要りません。

個々のボディは摩擦と反発を上書きできます。触らなければ、ワールドの値を継承します。

衝突

2 つのものが触れると、両方に伝わります。それぞれで on-collide イベントが発火し、それぞれが 何にぶつかったかを知ります。イベントの中で特定のオブジェクトに絞ることも、開いたままにすることも できます。

衝突は親には伝わりません

タップと違い、実際に触れたオブジェクトでしか発火しません。イベントは、ぶつかる側に付けてください。

そもそも物理が動くのはどこか

どこ物理は動く?
プレイヤー(ウェブ)動きます
ARClip アプリ(モバイル)動きます
エディター動きません。作業中に何かが落ちることはありません

プレイヤーでも、エンジンが物理を起動するのは、シーンがそれを必要とするときだけです。dynamic か kinematic なものがある、ゲーム操作がある、ボディと script がある、といった場合です。静的な背景 だけのシーンはその代金を払いません。ウェブでは、来場者に数メガバイトのダウンロードをさせずに 済むということです。

判定は生きているので、セッション中に script が作ったボールが、自分のために物理を起動させます。


次へ: ライト — そして、なめらかに変化するもの。