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
WebGL + 3D models by using Three.js Blender Exp...
Search
yomotsu
January 25, 2015
Programming
17k
18
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebGL + 3D models by using Three.js Blender Exporter
yomotsu
January 25, 2015
More Decks by yomotsu
See All by yomotsu
three.jsとRapierでレースゲームが3日でできた話
yomotsu
0
870
PBR in three.js
yomotsu
1
1.2k
dialog要素でつくるモーダルダイアログ
yomotsu
0
1.1k
IE to Edge
yomotsu
1
400
A Camera Control Library for three.js
yomotsu
1
1.5k
Let’s try AR on mobile Web with <model-viewer>
yomotsu
0
600
WebXR: Beyond WebGL
yomotsu
2
1.9k
Non-DOM components with WebGL in Vue.js
yomotsu
5
13k
WebGL Libs for WebApp Frameworks
yomotsu
4
7.9k
Other Decks in Programming
See All in Programming
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
730
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.2k
Contextとはなにか
chiroruxx
1
350
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.4k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
JavaDoc 再入門
nagise
1
370
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
52k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
370
HDC tutorial
michielstock
2
720
Site-Speed That Sticks
csswizardry
13
1.2k
WCS-LA-2024
lcolladotor
0
650
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
610
How to build a perfect <img>
jonoalderson
1
5.7k
Transcript
WebGL + 3D models by using Three.js Blender Exporter Presented
by Akihiro Oyamada (@yomotsu) Jan 25, 2015
Frontend Engineer at PixelGrid, Inc. @yomotsu recent works • http://yomotsu.github.io/walkthrough/
• http://yomotsu.github.io/xmas2014/ Akihiro Oyamada
Download the hands-on material https://github.com/tokyowebglmeetup/ h5conf2015_session2/
three.js and Blender
5 http://threejs.org/
6 http://www.blender.org/
WebGL + 3D models is much more fun!
You don't make 3D models? There are many 3D models
with open license!
9 http://nasa3d.arc.nasa.gov/
10 http://blendswap.com/
11 https://www.yobi3d.com/
Now you can prepare 3D models. How do we convert
3D models to WebGL?
three.js Blender exporter!
FYI We use previous exporter r69 The brand new exporter
(r70) is still limited a bit, as of January 2015
How to install Blender exporter
Download three.js r69 for previous blender exporter 16 https://github.com/mrdoob/three.js/releases/tag/r69
Although, we don't use this time, You can get latest
three.js package for the new Exporter, from GitHub 17 https://github.com/mrdoob/three.js or FYI
Copy io_three folder three.js-r69 ... utils exporters blender 2.65 scripts
addons io_three
Put io_three into following place Windows: C:\Program Files\Blender Foundation\Blender\2.7X\scripts\addons\
Mac OSX: /Applications/blender.app/Contents/Resources/2.7X/scripts/addons/
Can’t Open Blender as a folder in your Mac? Just
right click, then Show Package Contents
Macintosh HD/Applications/blender.app/Contents/Resources/2.7X/scripts/addons/ C:\Program Files\Blender Foundation\Blender\2.7X\scripts\addons\
Launch Blender
File > User Preferences
Type in three in the search box
Mark to activate
Press Save User Setting button
Now three.js Exporter is ready!
1. Download three.js package 2. Copy io_three folder 3. Put
it into scripts/addons folder of Blender 4. Active the addon under User Preferences > Addons SFWJFX
How to publish a 3D model
we are gonna use alfaromeo.blend html5conf/session2 _original 1_object alfaromeo.blend ...
...
None
Mouse TrackPad Rotate Pan Zoom Select CBTJDPQFSBUJPO + shift +
shift
Mouse TrackPad Translate Rotate Scale Delete CBTJDPQFSBUJPO → G →
R → S → G → R → S Z Z
None
Mark following options, then save it.
You will have a JSON file and texture images model
data texture textu
How to append the 3D model into a Web page
var width = window.innerWidth, height = window.innerHeight, clock = new
THREE.Clock(), scene, camera, renderer, ambientLight, directionalLight, loader, alfaromeo = new THREE.Object3D(); ! scene = new THREE.Scene(); ! camera = new THREE.PerspectiveCamera( 40, width / height, 1, 1000 ); camera.position.set( 0, 1, 5 ); ! renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( width, height ); document.body.appendChild( renderer.domElement ); write code as usual
directionalLight, loader, alfaromeo = new THREE.Object3D(); ! scene = new
THREE.Scene(); ! camera = new THREE.PerspectiveCamera( 40, width / height, 1, 1000 ); camera.position.set( 0, 1, 5 ); ! renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( width, height ); document.body.appendChild( renderer.domElement ); ! ambientLight = new THREE.AmbientLight( 0xffffff ) scene.add( ambientLight ); ! directionalLight = new THREE.DirectionalLight( 0xffffff ); directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add( new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); write code as usual
camera.position.set( 0, 1, 5 ); ! renderer = new THREE.WebGLRenderer(
{ antialias: true } ); renderer.setSize( width, height ); document.body.appendChild( renderer.domElement ); ! ambientLight = new THREE.AmbientLight( 0xffffff ) scene.add( ambientLight ); ! directionalLight = new THREE.DirectionalLight( 0xffffff ); directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add( new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); loader.load( 'alfaromeo.json', function( geometry, materials ) { ! alfaromeo = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); ! write code as usual
! ambientLight = new THREE.AmbientLight( 0xffffff ) scene.add( ambientLight );
! directionalLight = new THREE.DirectionalLight( 0xffffff ); directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add( new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); loader.load( 'alfaromeo.json', function( geometry, materials ) { ! alfaromeo = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); ! scene.add( alfaromeo ); ! } ); ! ( function renderLoop () { write code as usual
! ambientLight = new THREE.AmbientLight( 0xffffff ) scene.add( ambientLight );
! directionalLight = new THREE.DirectionalLight( 0xffffff ); directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add( new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); loader.load( 'alfaromeo.json', function( geometry, materials ) { ! alfaromeo = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); ! scene.add( alfaromeo ); ! } ); ! ( function renderLoop () { make a loader
directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add(
new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); loader.load( 'alfaromeo.json', function( geometry, materials ) { ! alfaromeo = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); ! scene.add( alfaromeo ); ! } ); ! ( function renderLoop () { ! requestAnimationFrame( renderLoop ); var elapsed = clock.getElapsedTime(); alfaromeo.rotation.y = elapsed / 2; renderer.render( scene, camera ); use load method
directionalLight.position.set( 0, 1, 0 ); scene.add( directionalLight ); ! scene.add(
new THREE.GridHelper( 10, 1 ) ); ! loader = new THREE.JSONLoader(); loader.load( 'alfaromeo.json', function( geometry, materials ) { ! alfaromeo = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); ! scene.add( alfaromeo ); ! } ); ! ( function renderLoop () { ! requestAnimationFrame( renderLoop ); var elapsed = clock.getElapsedTime(); alfaromeo.rotation.y = elapsed / 2; renderer.render( scene, camera ); make call back
new THREE.MeshFaceMaterial( materials ) ); ! scene.add( alfaromeo ); !
} ); ! ( function renderLoop () { ! requestAnimationFrame( renderLoop ); var elapsed = clock.getElapsedTime(); alfaromeo.rotation.y = elapsed / 2; renderer.render( scene, camera ); ! } )(); render it!
None
How to publish a 3D model with animations
None
Apply rest pose 1. go to Pose Mode 2. select
all bones 3. Pose > Clear Transform > All 4. ctrl + A 5. Apply Location 6. ctrl + A 7. Apply Rotation 8. ctrl + A 9. Apply Scale
Mark following options, and set Frame step. then save it.
load JSON
active skinning
make a SkinnedMesh
make animations
add it
start an animation
update animations
None
TIPS
Blender exporter does not support CJK letters for names of
geometries, materials, bones and others. Replace them to ascii
Since WebGL work on web browsers, .tga image format is
not supported. use PNG images instead.
three.js does not support IK, Bake as FK in Blender
see http://yomotsu.net/blog/2014/02/19/convert-mmd-for- threejs.html
If you publish a model with animations, set rest pose
in Blender see http://stackoverflow.com/questions/18752146/blender- exports-a-three-js-animation-bones-rotate-strangely/ 18770716#18770716
The New Blender Exporter Features
• BufferGeometry • Precision for float numbers • Debug logging
gl.finish(); @yomotsu