Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
Search
永田哲平
November 30, 2025
0
99
Matter.jsでつくる「ぷにゃっ」と動く物理演算Webエフェクトとパフォーマンス改善
永田哲平
November 30, 2025
Tweet
Share
More Decks by 永田哲平
See All by 永田哲平
ブラウザストレージを活用した配信画面デザインツール「Alive Studio」の仕組みと設計について
teppei0717
0
57
ブラウザストレージを活用した、複数アプリをまたぐ永続化とリアクティブな同期
teppei0717
5
1.1k
Claude Code VS Gemini CLI Let’s 競技Vibe Coding
teppei0717
1
220
「Devin!!! まだお前の口からまだ聞いてねェ!!! 『生きたい』と言えェ!!!!!!」
teppei0717
0
45
VibeCodingで 加速する開発と支援
teppei0717
0
840
あなたの配信ワイワイたりていますか?? 配信を盛り上げるAI「waiwai-ai」を作った話
teppei0717
0
390
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
GraphQLとの向き合い方2022年版
quramy
49
14k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
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!