Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Search
永田哲平
November 30, 2025
700
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
永田哲平
November 30, 2025
More Decks by 永田哲平
See All by 永田哲平
ブラウザストレージを活用した配信画面デザインツール「Alive Studio」の仕組みと設計について
teppei0717
0
660
ブラウザストレージを活用した、複数アプリをまたぐ永続化とリアクティブな同期
teppei0717
5
1.9k
Claude Code VS Gemini CLI Let’s 競技Vibe Coding
teppei0717
1
290
「Devin!!! まだお前の口からまだ聞いてねェ!!! 『生きたい』と言えェ!!!!!!」
teppei0717
0
60
VibeCodingで 加速する開発と支援
teppei0717
0
940
あなたの配信ワイワイたりていますか?? 配信を盛り上げるAI「waiwai-ai」を作った話
teppei0717
0
650
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
25k
Thoughts on Productivity
jonyablonski
76
5.4k
Practical Orchestrator
shlominoach
191
12k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
sira's awesome portfolio website redesign presentation
elsirapls
0
410
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Optimizing for Happiness
mojombo
378
71k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Transcript
1 Matter.jsでつくる「ぷにゃっ」と動く物理演算 Webエフェクトとパフォーマンス改善 てつを。(@tetsuwo0717)
物理演算( Physics Simulation) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 物体の運動を物理法則に基づき数値計算すること。
Matter.js Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・JavaScript製の2D剛体物理エンジン https://brm.io/matter-js/
Matter.js Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・"lightweight, optional utility which provides a simple canvas
based renderer" (軽量でオプショナルなユーティリティとして、シンプルなCanvasベースのレンダラー) ・ “An original JavaScript physics implementation (not a port)” ・Box2DなどのC/C++エンジンの移植/ラッパーではない(依存が無い) ・ブラウザ上で動作する2Dの物理エンジンとして比較的手軽に導入 できるライブラリ https://brm.io/matter-js/docs/classes/Render.html https://github.com/liabru/matter-js/blob/master/README.md
Matter.js(基本的な書き方) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 使用するモジュールを取得 他にも・・・ ・Constraint, // 2つのオブジェクトを接続 ・MouseConstraint // ドラッグ機能
Matter.js(基本的な書き方) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 エンジン作成
Matter.js(基本的な書き方) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 レンダラー作成 ・エンジンやレンダリングしたい範囲を引数にとる
Matter.js(基本的な書き方) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 定義した形のオブジェクトをエンジンに追加 (個人的にengine.worldという命名が好き...) ・polygon(多角形) ・circle(円) ・trapezoid(台形) ・fromVertices(カスタム形状)
Matter.js(画像) Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 物体に対して画像を貼り付けられる ※Bodyのサイズ(当たり判定)と画像サイズは別 ↓ うまく調整して違和感のないサイズに
ある日・・・ Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 あのぬいぐるみのやついい感じだね…!! 次作るやつさ、なんか、こう、ちょっと 「ぷにゃっ」 とさせることできない??
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 剛体
Matter.js Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・剛体とはいいつつ、軟体を表現するデモはあった ・複数の剛体を組み合わせるやり方 → オブジェクトそのものは軟体に見えるが、結局オブ ジェクト本体をそのまま表示する訳ではない → 別のアプローチへ https://brm.io/matter-js/demo/#softBody
Events Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 → 物理エンジンで起きる出来事(衝突、更新など)を「イ ベント」として受け取れる。 https://brm.io/matter-js/docs/classes/Engine.html#events 受け取れるイベントの形式 Events.on(Engine, "afterUpdate", callback)
Events.on(Engine, "beforeSolve", callback) Events.on(Engine, "beforeUpdate", callback) Events.on(Engine, "collisionActive", callback) Events.on(Engine, "collisionEnd", callback) Events.on(Engine, "collisionStart", callback)
Eventsを用いて軟体を表現できないか Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Eventsを用いた衝突方向の推定 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・normal = 法線ベクトル・・・衝突面に対して垂直な方向を示すベクトル(衝突面から押し出す方向 を示す) bodyA bodyB bodyA bodyB
Eventsを用いた衝突方向の推定 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・normal = 法線ベクトル・・・衝突面に対して垂直な方向を示すベクトル(衝突面から押し出す方向 を示す) bodyA bodyB bodyA bodyB
{ x: 0, y: 1 } { x: 1, y: 0 }
Eventsを用いた衝突方向の推定 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 どの面に対して衝撃があったかを推定することができる 例
Eventsを用いた衝突速度の推定 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・各オブジェクトはvelocityというパラメータを持っている velocity・・・オブジェクトが1フレーム(一回の計算)で移動する量を示す t=0: body(x=0, y=0) y軸 x軸
Eventsを用いた衝突速度の推定 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 ・各オブジェクトはvelocityというパラメータを持っている velocity・・・ボディが1フレーム(一回の計算)で移動する量を示す t=0: body(x=0, y=0) t=1: body(x=6, y=-8)
velocity = { x: 6, y: -8 } y軸 x軸 ※移動方向が決まれば衝突方向もわかりそうだが結局どこがぶつかったかがわからない →ピタゴラスの定理により速度が推定できる
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 描画への反映 Matter.js → 物理計算(位置、速度、衝突) JavaScript → 計算結果からCSSへの適用(イベント駆動) CSS →
描画とアニメーション 衝突方向(event.normal) どれくらいの速度でぶつかったか (body.velocity) 例 定数(ぷにゃっとさせ具合)
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 描画への反映 https://gmodecorp.com/ 素材:ぷにゃん 株式会社ジー・モード 衝突した方向/速度に応じた縮みを表現
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 1.最大オブジェクト数 /FPSの制限 パフォーマンス面 物理演算で使用するオブジェクト数を一定に保つ →配列の先頭削除(shift)で古いエフェクトから削除( FIFO) FPS(1秒間に何回計算するか)の指定もできる →用途に応じた適切な FPSを指定
https://brm.io/matter-js/docs/classes/Runner.html
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 2.エンジン/静的ボディの共有 パフォーマンス面 エンジン の共有 ・全コンポーネントで 1つのEngineインスタンスを共有 ・例:シングルトン 静的ボディ の再利用
・壁/地面 ・初回のみ作成して使い回す
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善 3.クリーンアップ パフォーマンス面 イベントリスナー の管理 ・多くのイベントを扱う ・addEventListener → removeEventListener ・ライフサイクルに応じたクリーンアップ
物理オブジェクト の削除 ・world.push() → world.splice() ・削除しないと非表示のボディが物理演算の対象に残る →気づきにくい
まとめ ・Matter.jsはJavaScript製の2D剛体物理エンジン。比較的手軽に物理演算がブラ ウザ上でできる。 ・物理演算とイベントを組み合わせた表現も可能(音/アニメーションなど) ・ エンジンの使い回し・オブジェクト数制限・メモリリークの防止といった基本的な最 適化を行うことで、物理演算の計算コストを抑え、安定動作とメモリ使用量の一定化 ができる。 Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
28 Thank you!