ちいつる
A-06リファレンス

物理演算の実装ロジック

重力・衝突・バネ等の計算式と、アプリ・ゲームへの組込み例をセットで示す。

触ってみる円をドラッグして離してみてください

指を離した瞬間の「ばよん」は、このページで扱う「バネ・ダンパーモデル」そのもの。目標へ引き戻すばねの力と、勢いを削ぐダンパーの力。この2つのせめぎ合いが、機械的な動きに「重さ」を宿らせる。以下、これを部品ごとにばらしていく。

重力・慣性・摩擦の基本式

物体の動きは「位置・速度・加速度」の3つを毎フレーム更新するだけで表現できる。速度に重力加速度を加算し、位置に速度を加算する。摩擦は速度に1未満の係数を掛けて徐々に減衰させるだけで、それらしい質感が出る。難しい物理法則を厳密に解く必要はなく、ゲームでは「見た目として自然かどうか」が優先される。

触ってみるタップでボールを追加し、スライダーで重力・反発・摩擦を変えてみてください

速度に重力を足し、位置に速度を足し、最後に係数を掛けて減らす。やっていることはこれだけなのに、月面のふわりとした落下も、砂地の鈍い転がりも、数値の匙加減で描き分けられてしまう。

触ってみる発射点からドラッグして角度と強さを決め、離して発射してみてください
発射角
45°
初速
28 m/s
飛距離
80 m
最長
0 m

発射点からドラッグ → 離して発射。旗(最長記録)を超えられる角度を探してみて。

狙う角度を変えていくと、飛距離の旗が一番遠くに立つのはある一点——45°。水平方向の等速と垂直方向の落下、直交する2つの動きの積がここで最大になる。低く撃っても高く上げすぎても届かないのは、経験則ではなく式からそう決まっているからだ。

衝突判定の実装パターン

矩形同士なら座標の重なりを見るAABB(軸並行境界ボックス)判定、円同士なら中心間の距離と半径の和を比較する判定が最も軽い。複雑な形状にはこれらを組み合わせた近似で十分なことが多く、厳密な多角形衝突判定はゲームの規模に対して過剰になりがちである。

触ってみる円と矩形をドラッグして重ねてみてください
円 × 円(距離 < 半径の和)矩形 × 矩形(AABB)円 × 矩形(最近接点)

図形が重なった瞬間の発光を決めているのは、円なら中心間の距離と半径の和、矩形なら座標の重なり(AABB)の判定。派手な当たり判定に見えても、ゲームの多くはこの手の単純な大小比較の積み重ねでできている。

触ってみる矢印の根元をドラッグして入射方向を変えてみてください
入射角 0°反射角 0°入射角 = 反射角
壁の角度
20°
反発係数 e
1.00

当たったかを判定したら、次は「どう跳ね返すか」。速度のうち壁に垂直な成分(法線成分。v·n は速度と法線の内積で、壁に向かう勢いの大きさを表す)だけを取り出し、反発係数ぶん反転させる——反射後 = v − (1+e)(v·n)n。e=1なら入射角と反射角がぴたり一致し、小さくするほど跳ね返りが鈍る。

バネ・ダンパーモデル

目標値に向かって「ばよん」と揺れながら収束する動きは、バネ(目標との差に比例した力)とダンパー(速度に比例して減衰させる力)を組み合わせて作る。UIのドラッグ操作の「戻り」やキャラクターの追従カメラなど、機械的な動きに「重さ」を持たせたい場面で頻出する。

触ってみるおもりをつかんで引き離し、離して戻り方を見てください(k・cのスライダーで性格が変わります)
減衰比 ζ
0.34
行き過ぎ
整定時間
不足減衰おもりをつかんで引き、離してみて
ばね定数 k(硬さ)
80
減衰 c
6.0

同じおもりを引いて離しても、減衰cを動かすと戻り方の「性格」がまるで変わる。ζ<1では目標を追い越して何度か揺れ、ζ=1でぴたりと一度で収まり、ζ>1では這うように鈍く戻る。UIの気持ちよさは、このζをどこに置くかの一点にかかっている。

触ってみるキャンバスをタップ・ドラッグして目標を動かしてみてください
線形補間(行き過ぎない)バネ(行き過ぎて戻る)
追従の速さ
8.0

線形補間(指数平滑)は目標へ単調に近づき、決して行き過ぎない。対してバネは勢いを溜め、一度追い越してから戻る。確実に収めたい追従には補間、質感がほしい追従にはバネ、と役割が分かれる。

キャラ操作・UI物理への組込み例

キャラクター操作では、入力キーから直接速度を決めるのではなく「目標速度」を決めてそこへ慣性を持って近づける実装にすると、急停止・急発進のカクつきが消える。UIでもドラッグ終了後に慣性でスクロールが続く「フリック」の実装は同じバネ・ダンパーの考え方の応用である。

触ってみるキャンバスをドラッグして方向を入力し、離してみてください
加速の鋭さ(小さいほど慣性が強く滑らか)
6.0

入力から目標速度を決め、現在の速度をそこへ慣性で寄せる。すると指を離した後もキャラは一拍滑ってから止まる。加速を鋭くすれば入力に忠実で機械的に、緩めれば重く滑らかに。操作感の印象は、この調整ひとつで大きく動く。

触ってみるリストを上下にドラッグして勢いよく離してみてください
摩擦(大きいほど早く止まる)
2.5

フリックは、ドラッグ終端の速度をそのまま初速にした慣性走行。あとは摩擦で少しずつ減速し、端まで来たらゴムのように引き戻すだけだ。落下で使った「速度に係数を掛けて減らす」式が、スクロールでもそっくり働いている。

触ってみるdtとステップ数のスライダーを動かして軌道の違いを見てください
陽的オイラー(外へ発散)シンプレクティック(安定)
陽的の終端エネルギー 17.58(初期0.50)
タイムステップ dt(大きいほど誤差が拡大)
0.15
ステップ数
160

最後は「積む順番」の落とし穴。速度の更新に古い位置を使う陽的オイラーはエネルギーが少しずつ増え、軌道が外へ発散していく。先に速度を更新し、その速度で位置を進めるシンプレクティック(半陰的)オイラーなら安定する。dtを上げるほど差は歴然で、式が同じでも積む順序が結果を左右する。

次はこれ