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
860
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Infiniteloop
June 06, 2024
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
14
50k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
480
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
680
詫び石の裏側
infiniteloop_inc
0
720
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
33k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
220
ADRという考えを取り入れてみて
infiniteloop_inc
0
210
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
170
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
140
Other Decks in Programming
See All in Programming
技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt
yoshiyoshifujii
0
160
Doma で目指す ORM 最適解
nakamura_to
1
160
List Unfolding - 'unfold' as the Computational Dual of 'fold', and how 'unfold' relates to 'iterate'"
philipschwarz
PRO
0
120
OpenTelemetry + LLM = OpenLLMetry!?
yunosukey
2
380
"使いづらい" をリバースエンジニアリングする UI の読み解き方
rebase_engineering
0
110
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
120
Interface vs Types ~型推論が過多推論~
hirokiomote
1
230
複雑なフォームを継続的に開発していくための技術選定・設計・実装 #tskaigi / #tskaigi2025
izumin5210
12
6.2k
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
260
當開發遇上包裝:AI 如何讓產品從想法變成商品
clonn
0
2.4k
少数精鋭エンジニアがフルスタック力を磨く理由 -そしてAI時代へ-
rebase_engineering
0
120
TypeScript エンジニアが Android 開発の世界に飛び込んだ話
yuisakamoto
6
930
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
RailsConf 2023
tenderlove
30
1.1k
4 Signs Your Business is Dying
shpigford
183
22k
The Cost Of JavaScript in 2023
addyosmani
49
8k
Git: the NoSQL Database
bkeepers
PRO
430
65k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
34k
Unsuck your backbone
ammeep
671
58k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
460
Designing for humans not robots
tammielis
253
25k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Six Lessons from altMBA
skipperchong
28
3.8k
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 ご清聴ありがとうございました