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
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / l...
Search
にー兄さん
October 24, 2026
Programming
16
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
Vue Fes Japan 2026でLT登壇した資料です
https://vuefes.jp/2026/speaker/drumath2237
にー兄さん
October 24, 2026
More Decks by にー兄さん
See All by にー兄さん
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
620
ついにAuraも登場したのでJetpack XR SDKについて今一度語りたい / i wanna talk about xreal aura
drumath2237
0
50
『Ground Truth: How We Create Geometrically Accurate Reconstructions (Niantic Spatial Blog)』 を読む / read Ground Truth: How We Create Geometrically Accurate Reconstructions
drumath2237
0
86
この時代にOSS開発に向き合ってみる / face the oss development in this era
drumath2237
0
69
プログラマの職能が代替可能になりつつあるこの時代でプログラムと向き合う修行を積む / dedicating myself to the discipline of programming
drumath2237
0
140
個人的3D Gaussian Splattingニュースをご紹介 / sharing 3d gaussian splatting news
drumath2237
0
690
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
940
XRエンジニアの視点から XRのイマと社会実装の実現について考える / thinking-about-xr-popularization
drumath2237
0
100
軽率にプログラミング言語のシンタックスについて考えてみよう / lets-think-about-programming-lang-syntax
drumath2237
0
150
Other Decks in Programming
See All in Programming
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
200
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
1.1k
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.2k
APNsからLive Activityを開始する話
yumnumm
0
170
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
1k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
Domain-Driven Transformation
hschwentner
2
2.3k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
190
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.7k
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
200
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Exploring anti-patterns in Rails
aemeredith
4
540
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
GraphQLとの向き合い方2022年版
quramy
50
15k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
First, design no harm
axbom
PRO
2
1.3k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
450
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
Transcript
Web3Dライブラリを作って Vue Custom Renderer の 仕組みを理解しよう にー兄さん@ninisan_drumath Vue Fes Japan
2026
にー兄さん ソフトウェアエンジニア@HoloLab inc. Babylon.js勉強会運営 Iwaken Lab. Microsoft MVP for Developer
Technologies (2024~) 好きな技術 Babylon.js / WebXR Device API / Android XR / 3D Gaussian Splatting @ninisan_drumath @drumath2237 @drumath2237.bsky.social
本日の資料は撮影・SNS共有OKです📸 (公開予定)
本日のお話 最近Custom Rendererを用いた3Dラッパライブラリを作っていた なんとなくCustom Rendererの有志の情報があんまりなさそう → 共有してみよう TresJSなどがどのような仕組みを使っているのか 気になる方に刺さると嬉しい
サンプルプロジェクト https://github.com/drumath2237/vue-custom3d-renderer-sandbox https://github.com/drumath2237/vue-customrenderer-playground
アジェンダ 1. Custom Rendererと Web3Dライブラリについて 2. Custom Rendererによる 3Dシーンの実装 3.
おわりに
Custom Rendererと Web3Dライブラリについて
Vue Custom Rendererとは Vue SFCで構造的なデータを作成・表現できる仕組み @vue/runtime-core で提供されている機能 実際に @vue/runtime-dom ではDOMに対するRendererを実装
DOM以外のデータに対しても自作のRendererが作れる 例) PDF文書 TUI Webメール 設定データ
3Dのシーンもヒエラルキ構造を成す 3Dのシーンにはカメラやライト、 メッシュやエフェクトなどが存在 オブジェクト同士は親子関係を構築できる (Web)3Dライブラリは 手続き的な処理によってこれを実現 Custom Rendererでラップすれば 宣言的に記述可能になりそう Babylon
Liteによるシーン実装例 const engine = await createEngine(renderCanvas) const scene = createSceneContext(engine) const camera = createDefaultCamera(scene) attachControl(camera, renderCanvas, scene) const light = createDirectionalLight([1, -1, 1]) addToScene(scene, light) const box = createBox(engine, 1) const material = createStandardMaterial() box.material = material addToScene(scene, box) const sphere = createSphere(engine) sphere.parent = box await registerScene(scene) await startEngine(engine)
Custom Rendererによる 3Dシーンの実装
createRenderer()でRendererの作成 createRenderer 関数の型定義 createRenderer<HostNode, HostElement>(options: RendererOptions<HostNode, HostElement>): Renderer<HostElement>; Rendererを作成してレンダー処理を開始 const
renderer = createRenderer(nodeOps) アプリ全体で を使う場合 // Custom Renderer const app = renderer.createApp(rootComponent) createApp(app).mount('#app') 特定コンポーネントの を として扱う場合 // or slots Custom Renderer renderer.render(rootComponent, rootContainer)
RendererOptionsの実装 createRenderer() が引数に 取るオプション 独自定義のElement/Nodeの動作を定 義するメインの部分 慣習的に nodeOps という名前で定義 される事が多い
RendererOptionsの定義必須の関数たち const nodeOps: RendererOptions = { createElement(type, namespace, isCustomizedBuiltin, props) {...}, createComment(text) {...}, createText(text) {...}, insert(element, parentNode) {...}, nextSibling(node) {...}, parentNode(node) {...}, patchProp(element, key, prevValue, nextValue) {...}, remove(node) {...}, setElementText(node, text) {...}, setText(node, text) {...}, }
要素の作成フローと親子関係の構築(1/3) <SceneVue> <Box> <Material /> <Sphere> <Material /> </Sphere> <Box>
<Material /> </Box> </Box> </SceneVue> 右のようなElementの構造になる
要素の作成フローと親子関係の構築(2/3) <SceneVue> <Box> <Material /> <Sphere> <Material /> </Sphere> <Box>
<Material /> </Box> </Box> </SceneVue> createElement が呼ばれて Elementを作成しておく この時に親子関係などはいったん置いておき、オブ ジェクト単体を作成 ツリーが走査される過程で行きがけ順に呼ばれる
要素の作成フローと親子関係の構築(3/3) <SceneVue> <Box> <Material /> <Sphere> <Material /> </Sphere> <Box>
<Material /> </Box> </Box> </SceneVue> Elementが作成されたら insert が呼ばれる parentのElementがわかるので、ここで親子関係を 構築すると良さそう ツリーが走査される過程で帰りがけ順に呼ばれる
実際のレンダリング結果 <SceneVue> <DirectionalLight :direction="vec3(-0.5, -1, 1)" /> <Box :position="vec3(0, 0.5,
0)" :size="0.5"> <Material :color="{ r: 1, g: 0, b: 0 }" /> <Sphere :diameter="0.3" :position="vec3(0.5, 0, 0)"> <Material :color="{ r: 1, g: 1, b: 1 }" /> </Sphere> <Box :position="vec3(0, -0.5, 0)" :size="0.5"> <Material :color="{ r: 0, g: 0, b: 1 }" /> </Box> </Box> </SceneVue>
おわりに
おわりに DOM以外の表現をしたいときの強力なツールだと感じた Custom Rendererを通してVueのレンダリングの仕組みに興味を持てた HostElement/HostNodeの設計はちょっと迷うなぁ
参考文献 Custom Renderer API https://vuejs.org/api/custom-renderer.html @vue/runtime-dom(github) https://github.com/vuejs/core/tree/main/packages/runtime-dom Building a Vue
3 Custom Renderer(youtube) https://www.youtube.com/playlist?list=PLC2LZCNWKL9b876nPMVULEyBzkVoH8B7n vue-pdf-renderer-demo https://github.com/lmiller1990/vue-pdf-renderer-demo/tree/article-final