Slide 1

Slide 1 text

ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~ 2024/05/31 タガヤス 株式会社インフィニットループ 及川 陽平

Slide 2

Slide 2 text

自己紹介 ● 名前: 及川 陽平 ● バックエンドエンジニア (IL入社以前は組込み、Web、スマホゲームなど) ● 言語: PHP, Python, C/C++ 2

Slide 3

Slide 3 text

メイントピック ● 簡単な2Dの物理エンジンを自前で作ってみた 3

Slide 4

Slide 4 text

モチベーション ● 学生時代に、電磁気のシミュレーションの研究に取り組んでいた ● 社会人になってからはシミュレーションとは縁遠くなった → ゲームのサーバーサイド開発がメイン ● ゲーム開発で一般的な力学系のシミュレーションの知識はなかったの で興味を持った 4

Slide 5

Slide 5 text

Index ● 運動方程式について ● 方程式の近似手法について ● 剛体の運動を表す方程式とシミュレーションアルゴリズム ● 成果物 & 所感 5

Slide 6

Slide 6 text

Index ● 運動方程式について ● 方程式の近似手法について ● 剛体の運動を表す方程式とシミュレーションアルゴリズム ● 成果物 & 所感 6

Slide 7

Slide 7 text

質量mの物体に力fを加えると、その物体の加速度はaになる 物体の運動を表現する数式 7 力 加速度 質量m 運動方程式

Slide 8

Slide 8 text

位置・速度・加速度の関係 8 位置 速度 加速度 時間で 微分 時間で 微分 時間で 積分 時間で 積分

Slide 9

Slide 9 text

運動方程式の微分形 9 これらをもとに、物体の速度、位置を求める 諸条件 ● 初期位置 ● 初期速度 ● 作用する力 + 支配方程式

Slide 10

Slide 10 text

10 どうやって解けばよいか? 

Slide 11

Slide 11 text

Index ● 運動方程式について ● 方程式の近似手法について ● 剛体の運動を表す方程式とシミュレーションアルゴリズム ● 成果物 & 所感 11

Slide 12

Slide 12 text

差分法: 微分を差分で近似 少し先の未来の値を、過去の既知の値を使って表す 12 速度 速度 時間 未知の値 既知の加速度 差分近似 時間 既知の値

Slide 13

Slide 13 text

更新式 更新式を繰り返し解いて未来の値を順次求めていく 13 未来の位置 過去の位置 過去の速度 未来の速度 過去の速度 過去の力 差分近似 差分近似

Slide 14

Slide 14 text

Index ● 運動方程式について ● 方程式の近似手法について ● 剛体の運動を表す方程式とシミュレーションアルゴリズム ● 成果物 & 所感 14

Slide 15

Slide 15 text

剛体 (rigid body) とは ● 力が加わっても変形しない理想的な物体 ● 現実には存在しないが、力学的に扱いが簡単 ● 今回は2次元の多角形についてシミュレーション 15

Slide 16

Slide 16 text

剛体の運動 ● 並進運動と回転運動を考える必要がある 16 角加速度 角速度 角度 加速度 速度 位置

Slide 17

Slide 17 text

回転の運動方程式 ● 並進運動と回転運動を考える必要がある 17 運動方程式 回転運動の運動方程式 質量 加速度 力 トルク 角加速度 慣性モーメント

Slide 18

Slide 18 text

剛体に作用する力、トルク 18 重力 壁・床と衝突した際の 力、トルク 剛体同士が衝突した際の 力、トルク 摩擦なし、あり

Slide 19

Slide 19 text

壁・床との衝突 ー 摩擦なし ● 力積、角力積から、作用する力、トルクを求める 19 力積 (=力と時間の積) e: 反発係数、I: 慣性モーメント m: 質量 ※ 2次元では z方向成分のみ 角力積 (=トルクと時間の積) 単位法線ベクトル 重心-衝突点ベクトル トルク 衝突前の速度

Slide 20

Slide 20 text

壁・床との衝突 ー 摩擦あり ● 接線方向の力と、その力に応じたトルクも発生する 20 すべる場合 :動摩擦係数 単位接線 ベクトル 転がる場合

Slide 21

Slide 21 text

剛体同士の衝突 ー 摩擦なし ● 剛体同士の衝突時の力、トルクも、壁の場合と同様に力積から計算 21 力積 角力積 質量 質量 : 剛体1の衝突前の速度、 :剛体1の慣性モーメント : 剛体2の衝突前の速度、 :剛体2の慣性モーメント 単位法線ベクトル

Slide 22

Slide 22 text

剛体同士の衝突 ー 摩擦あり ● 接線方向の力と、その力に応じたトルクも発生する 22 転がる場合 すべる場合 :動摩擦係数 単位接線 ベクトル 単位接線 ベクトル

Slide 23

Slide 23 text

アルゴリズム ある時刻tにおいて、以下のフローで位置、角度を計算する 1. 衝突判定 → 衝突している可能性がある剛体のペアを検出 : SAP(sweep and prune)法 → 衝突している剛体の検出: GJK(Gilbert-Johnson-Keerthi)法 → 衝突時のめりこみの距離や方向を計算しめりこみ解消 : EPA(Expanding Polytope Algorithm)法 2. 重力、衝突による力の総和、トルクの総和を求める 3. 力の総和→加速度→速度→位置、と順番に計算する 4. トルクの総和→角加速度→角速度→角度、と順番に計算する 時刻を Δtだけ進めて、1.~4.の手順を繰り返す 23

Slide 24

Slide 24 text

Index ● 運動方程式について ● 方程式の近似手法について ● 剛体の運動を表す方程式とシミュレーションアルゴリズム ● 成果物 & 所感 24

Slide 25

Slide 25 text

剛体同士の衝突 (重力下、床あり) 25 ※ TypeScript, Three.js で実装

Slide 26

Slide 26 text

剛体同士の衝突 (無重力下) 26

Slide 27

Slide 27 text

転がり & 滑り運動 (多角形をランダム生成して落とす) 27

Slide 28

Slide 28 text

所感 ● 物理エンジンを自前で実装するのは大変 →単純な2Dのシミュレーションでも、考慮しなければいけないことは多い → 運動方程式の立式、差分化、衝突検知、etc… ● シミュレーションのための基本原理や手法の理解が深まった →既存のエンジンを使う場合でも、ボトルネックの把握や  パフォーマンス・チューニングで応用が効く →既存エンジンが対応していない物理現象でも拡張してシミュレーションできる 28

Slide 29

Slide 29 text

29 ご清聴ありがとうございました