🌊
(JS/TS) ゲームでよく使う「動き」を表現するための基本計算まとめ
動きを構成する3つの要素
- 位置 (Position):物体が存在する座標
- 速度 (Velocity):物体が動く速さと方向
- 加速度 (Acceleration):速度が変化する度合
① 一定速度での移動
物体が一定の速度で動く場合、位置の変化量(距離)は次の式で求められます。
📌 例:毎秒5mの速度で3秒動く場合
② 重力による落下(等加速度運動)
現実世界では「重力」という加速度が働くため、物体が落下する際は以下の式を使います。
※
📌 例:初速度0で2秒間落下した場合
🔍 地球上の物体は、重力加速度9.8 m/s²で落下する。
③ フレーム単位での移動(ゲームでよく使う)
ゲームでは秒ではなく「フレーム単位」で動きを計算することが一般的です。
📌 例:1秒間に120ピクセル動く速度 × 60fps
→ つまり、1フレームごとに2ピクセル動かせば、1秒間で120ピクセル動いたように見えます。
④ なめらかな動きを作る補間法(Interpolation)
線形補間(Linear Interpolation, 通称 lerp) を使えば、2つの座標間を滑らかに移動できます。
-
は 0〜1 の値をとり、0 のときは開始位置、1 のときは終了位置。t
| 中間値 | 意味 | |
|---|---|---|
| 0 | 開始点 | |
| 0.25 | 25% 地点 | |
| 0.5 | 中間点 | |
| 0.75 | 75% 地点 | |
| 1 | 終了点 |
📌 Aという物体がこのように中間値に沿って動くと、滑らかな移動になります。
⑤ 実際のコード例:JavaScriptでの簡単な落下運動
これは「等加速度運動」をシンプルに表現した例です。
let positionY = 0; // 現在位置
let velocityY = 0; // 現在速度
const gravity = 9.8; // 重力加速度(px単位)
const dt = 1 / 60; // フレーム間の時間(60fps)
function update() {
velocityY += gravity * dt; // 速度 = 現在速度 + 重力 × 経過時間
positionY += velocityY; // 位置 = 現在位置 + 最新の速度
item.style.top = positionY + 'px'; // 画面上の反映
requestAnimationFrame(update); // 次のフレームを呼び出し
}
update();
前提条件
| 項目 | 値 |
|---|---|
| 初期速度 | 0 px/frame |
| 初期位置 | 0 px |
| 加速度 | 2 px/frame² |
| フレーム時間 | 1 秒(単純化のため) |
フレームごとの計算結果
| フレーム | 速度の計算 |
位置の計算 |
速度 (v) | 位置 (p) |
|---|---|---|---|---|
| 0 | 2 | 2 | ||
| 1 | 4 | 6 | ||
| 2 | 6 | 12 | ||
| 3 | 8 | 20 | ||
| 4 | 10 | 30 | ||
| 5 | 12 | 42 | ||
| 6 | 14 | 56 |
算数が必要な理由を子供の頃から知っていてたら🥲
Discussion