Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Search
Infiniteloop
June 06, 2024
Programming
1
1.2k
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Infiniteloop
June 06, 2024
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
16
62k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
570
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
840
詫び石の裏側
infiniteloop_inc
0
810
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
34k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
250
ADRという考えを取り入れてみて
infiniteloop_inc
0
250
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
190
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
160
Other Decks in Programming
See All in Programming
Flutterアプリ運用の現場で役立った監視Tips 5選
ostk0069
1
520
モビリティSaaSにおけるデータ利活用の発展
nealle
1
640
AIの弱点、やっぱりプログラミングは人間が(も)勉強しよう / YAPC AI and Programming
kishida
13
5.4k
All(?) About Point Sets
hole
0
220
Phronetic Team with AI - Agile Japan 2025 closing
hiranabe
2
680
分散DBって何者なんだ... Spannerから学ぶRDBとの違い
iwashi623
0
120
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
500
CloudNative Days Winter 2025: 一週間で作る低レイヤコンテナランタイム
ternbusty
7
1.8k
Java_プロセスのメモリ監視の落とし穴_NMT_で見抜けない_glibc_キャッシュ問題_.pdf
ntt_dsol_java
0
230
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
5
1.1k
知られているようで知られていない JavaScriptの仕様 4選
syumai
0
640
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
130
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Navigating Team Friction
lara
190
16k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
GitHub's CSS Performance
jonrohan
1032
470k
How STYLIGHT went responsive
nonsquared
100
5.9k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Optimizing for Happiness
mojombo
379
70k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Transcript
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~ 2024/05/31 タガヤス 株式会社インフィニットループ 及川 陽平
自己紹介 • 名前: 及川 陽平 • バックエンドエンジニア (IL入社以前は組込み、Web、スマホゲームなど) • 言語:
PHP, Python, C/C++ 2
メイントピック • 簡単な2Dの物理エンジンを自前で作ってみた 3
モチベーション • 学生時代に、電磁気のシミュレーションの研究に取り組んでいた • 社会人になってからはシミュレーションとは縁遠くなった → ゲームのサーバーサイド開発がメイン • ゲーム開発で一般的な力学系のシミュレーションの知識はなかったの で興味を持った
4
Index • 運動方程式について • 方程式の近似手法について • 剛体の運動を表す方程式とシミュレーションアルゴリズム • 成果物 &
所感 5
Index • 運動方程式について • 方程式の近似手法について • 剛体の運動を表す方程式とシミュレーションアルゴリズム • 成果物 &
所感 6
質量mの物体に力fを加えると、その物体の加速度はaになる 物体の運動を表現する数式 7 力 加速度 質量m 運動方程式
位置・速度・加速度の関係 8 位置 速度 加速度 時間で 微分 時間で 微分 時間で
積分 時間で 積分
運動方程式の微分形 9 これらをもとに、物体の速度、位置を求める 諸条件 • 初期位置 • 初期速度 • 作用する力
+ 支配方程式
10 どうやって解けばよいか?
Index • 運動方程式について • 方程式の近似手法について • 剛体の運動を表す方程式とシミュレーションアルゴリズム • 成果物 &
所感 11
差分法: 微分を差分で近似 少し先の未来の値を、過去の既知の値を使って表す 12 速度 速度 時間 未知の値 既知の加速度 差分近似
時間 既知の値
更新式 更新式を繰り返し解いて未来の値を順次求めていく 13 未来の位置 過去の位置 過去の速度 未来の速度 過去の速度 過去の力 差分近似
差分近似
Index • 運動方程式について • 方程式の近似手法について • 剛体の運動を表す方程式とシミュレーションアルゴリズム • 成果物 &
所感 14
剛体 (rigid body) とは • 力が加わっても変形しない理想的な物体 • 現実には存在しないが、力学的に扱いが簡単 • 今回は2次元の多角形についてシミュレーション
15
剛体の運動 • 並進運動と回転運動を考える必要がある 16 角加速度 角速度 角度 加速度 速度 位置
回転の運動方程式 • 並進運動と回転運動を考える必要がある 17 運動方程式 回転運動の運動方程式 質量 加速度 力 トルク
角加速度 慣性モーメント
剛体に作用する力、トルク 18 重力 壁・床と衝突した際の 力、トルク 剛体同士が衝突した際の 力、トルク 摩擦なし、あり
壁・床との衝突 ー 摩擦なし • 力積、角力積から、作用する力、トルクを求める 19 力積 (=力と時間の積) e: 反発係数、I:
慣性モーメント m: 質量 ※ 2次元では z方向成分のみ 角力積 (=トルクと時間の積) 単位法線ベクトル 重心-衝突点ベクトル トルク 衝突前の速度
壁・床との衝突 ー 摩擦あり • 接線方向の力と、その力に応じたトルクも発生する 20 すべる場合 :動摩擦係数 単位接線 ベクトル
転がる場合
剛体同士の衝突 ー 摩擦なし • 剛体同士の衝突時の力、トルクも、壁の場合と同様に力積から計算 21 力積 角力積 質量 質量
: 剛体1の衝突前の速度、 :剛体1の慣性モーメント : 剛体2の衝突前の速度、 :剛体2の慣性モーメント 単位法線ベクトル
剛体同士の衝突 ー 摩擦あり • 接線方向の力と、その力に応じたトルクも発生する 22 転がる場合 すべる場合 :動摩擦係数 単位接線
ベクトル 単位接線 ベクトル
アルゴリズム ある時刻tにおいて、以下のフローで位置、角度を計算する 1. 衝突判定 → 衝突している可能性がある剛体のペアを検出 : SAP(sweep and prune)法
→ 衝突している剛体の検出: GJK(Gilbert-Johnson-Keerthi)法 → 衝突時のめりこみの距離や方向を計算しめりこみ解消 : EPA(Expanding Polytope Algorithm)法 2. 重力、衝突による力の総和、トルクの総和を求める 3. 力の総和→加速度→速度→位置、と順番に計算する 4. トルクの総和→角加速度→角速度→角度、と順番に計算する 時刻を Δtだけ進めて、1.~4.の手順を繰り返す 23
Index • 運動方程式について • 方程式の近似手法について • 剛体の運動を表す方程式とシミュレーションアルゴリズム • 成果物 &
所感 24
剛体同士の衝突 (重力下、床あり) 25 ※ TypeScript, Three.js で実装
剛体同士の衝突 (無重力下) 26
転がり & 滑り運動 (多角形をランダム生成して落とす) 27
所感 • 物理エンジンを自前で実装するのは大変 →単純な2Dのシミュレーションでも、考慮しなければいけないことは多い → 運動方程式の立式、差分化、衝突検知、etc… • シミュレーションのための基本原理や手法の理解が深まった →既存のエンジンを使う場合でも、ボトルネックの把握や パフォーマンス・チューニングで応用が効く
→既存エンジンが対応していない物理現象でも拡張してシミュレーションできる 28
29 ご清聴ありがとうございました