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.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Infiniteloop
June 06, 2024
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
18
86k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
720
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
1.1k
詫び石の裏側
infiniteloop_inc
0
960
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
36k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
310
ADRという考えを取り入れてみて
infiniteloop_inc
0
320
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
230
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
200
Other Decks in Programming
See All in Programming
act2-costs.pdf
sumedhbala
0
110
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
360
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
230
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
510
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
160
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
680
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
220
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
220
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Code Review Best Practice
trishagee
74
20k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
New Earth Scene 8
popppiees
3
2.4k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
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 ご清聴ありがとうございました