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
0
540
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
Infiniteloop
June 06, 2024
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
0
330
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
420
詫び石の裏側
infiniteloop_inc
0
420
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
6
26k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
160
ADRという考えを取り入れてみて
infiniteloop_inc
0
150
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
120
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
100
アニメーションとスキニングをBurstで独自実装する
infiniteloop_inc
0
270
Other Decks in Programming
See All in Programming
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
290
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
120
PHPカンファレンス 2024|共創を加速するための若手の技術挑戦
weddingpark
0
140
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築
sumiyae
3
580
Оптимизируем производительность блока Казначейство
lamodatech
0
950
Lookerは可視化だけじゃない。UIコンポーネントもあるんだ!
ymd65536
1
130
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
140
return文におけるstd::moveについて
onihusube
1
1.4k
オニオンアーキテクチャを使って、 Unityと.NETでコードを共有する
soi013
0
370
混沌とした例外処理とエラー監視に秩序をもたらす
morihirok
13
2.2k
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
360
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Optimizing for Happiness
mojombo
376
70k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Being A Developer After 40
akosma
89
590k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
230
52k
The Cost Of JavaScript in 2023
addyosmani
46
7.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Embracing the Ebb and Flow
colly
84
4.5k
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 ご清聴ありがとうございました