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
980
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Infiniteloop
June 06, 2024
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
16
55k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
510
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
730
詫び石の裏側
infiniteloop_inc
0
740
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
33k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
230
ADRという考えを取り入れてみて
infiniteloop_inc
0
230
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
170
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
150
Other Decks in Programming
See All in Programming
ニーリーにおけるプロダクトエンジニア
nealle
0
890
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
710
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
880
Goで作る、開発・CI環境
sin392
0
240
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
200
High-Level Programming Languages in AI Era -Human Thought and Mind-
hayat01sh1da
PRO
0
830
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
2
11k
GPUを計算資源として使おう!
primenumber
1
190
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
240
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
190
レベル1の開発生産性向上に取り組む − 日々の作業の効率化・自動化を通じた改善活動
kesoji
0
270
ふつうの技術スタックでアート作品を作ってみる
akira888
1
1.1k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Agile that works and the tools we love
rasmusluckow
329
21k
Done Done
chrislema
184
16k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Designing for humans not robots
tammielis
253
25k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
KATA
mclloyd
30
14k
Fireside Chat
paigeccino
37
3.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
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 ご清聴ありがとうございました