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
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Search
永田哲平
November 30, 2025
560
0
Share
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
永田哲平
November 30, 2025
More Decks by 永田哲平
See All by 永田哲平
ブラウザストレージを活用した配信画面デザインツール「Alive Studio」の仕組みと設計について
teppei0717
0
550
ブラウザストレージを活用した、複数アプリをまたぐ永続化とリアクティブな同期
teppei0717
5
1.7k
Claude Code VS Gemini CLI Let’s 競技Vibe Coding
teppei0717
1
250
「Devin!!! まだお前の口からまだ聞いてねェ!!! 『生きたい』と言えェ!!!!!!」
teppei0717
0
53
VibeCodingで 加速する開発と支援
teppei0717
0
900
あなたの配信ワイワイたりていますか?? 配信を盛り上げるAI「waiwai-ai」を作った話
teppei0717
0
560
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
10
37k
We Have a Design System, Now What?
morganepeng
55
8.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
730
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
900
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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!