three.jsによる一歩進めたグラフィカルな表現
TRANSCRIPT
![Page 1: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/1.jpg)
three.jsによる⼀歩進めたグラフィカルな表現
2016.08.03 ⼋⽊ 啓太
![Page 2: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/2.jpg)
⾃⼰紹介
⼋⽊ 啓太
2011年にデジタルハリウッドで学び、 卒業後はWebディレクターとして転職。 プログラムでものを作ることにやりがいを覚え、 現在は制作会社のフロントエンドエンジニアとして従事。
Twitter: @shafflife →気になった技術系トピックをつぶやいています。
![Page 3: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/3.jpg)
今夜はp5.jser縛り? でも気にせずthree.jsについて話します
p5.js
p5.js
p5.js ?
p5.js ?
p5.js ?
p5.js
![Page 4: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/4.jpg)
three.js使ってますか?
![Page 5: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/5.jpg)
ここで⽌まっていたりしませんか?
three.jsの導⼊で作ったサンプル
![Page 6: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/6.jpg)
今回のテーマ
・three.jsの導⼊について触れる記事は多いが、 そこからステップアップする内容のものが少ない
・やりたいことに近しいものがあるが、 バージョンが新しくなってそのまま使えなかったりする
現⾏バージョンに基づいた表現周りを かいつまんで紹介
![Page 7: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/7.jpg)
three.jsを使った表現あれこれ
1. three.jsのおさらい
2. オブジェクトのトゥイーンアニメーション
3. three.jsでテキストを扱う
4. skydome/skyboxで背景演出
5. 動的なマテリアル表現
![Page 8: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/8.jpg)
1. three.jsのおさらい(1/3)
three.jsとは・・・
WebGLを使った3Dグラフィック系ライブラリ。 WebGLをjsで1から書くと、多くのことを記述する必要 があるが、jQueryのように抽象化されており、 少ない記述で3D表現が可能。
![Page 9: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/9.jpg)
1. three.jsのおさらい(2/3)
Sceneを作る
CameraをSceneに設置 MeshをSceneに設置
LightをSceneに設置
Rendererで描画
ディスプレイ
2次元 3次元
![Page 10: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/10.jpg)
1. three.jsのおさらい(3/3)
Mesh(オブジェクト) のできあがり
=Material
+Geometry
![Page 11: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/11.jpg)
2. オブジェクトのトゥイーンアニメーション
![Page 12: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/12.jpg)
three.jsの導⼊で作ったサンプル(2回⽬)
ソースコードを⾒てみると
![Page 13: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/13.jpg)
// three.jsでSceneやMeshを作成 … … // アニメーションの関数 render();
function render(){ mesh.rotation.x += 0.01; mesh.rotation.z += 0.006; renderer.render(scene, camera); requestAnimationFrame(render); }
Rendererが描画するたびにオブジェクトの回転⾓を加算 →これはこれでいいけど、任意で変化をつけたアニメーションができない
![Page 15: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/15.jpg)
// TweenMax.to([要素], [秒数], { // [変更後プロパティ, (イージング)] // }
TweenMax.to(mesh.rotation, 1, { y: Math.PI * 2, ease: Power2.easeInOut, // easing onComplete: function(){ // アニメーション完了後に実⾏ } });
オブジェクトの⾓度だけでなく、位置やサイズの変更も可能
![Page 16: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/16.jpg)
3. three.jsでテキストを扱う
![Page 17: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/17.jpg)
対策:three.jsのサンプルコードを参考にする http://threejs.org/examples/#webgl_geometry_text
![Page 18: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/18.jpg)
// FontLoaderでfontファイルを読み込み、 // callbackでオブジェクト作成 var loader = new THREE.FontLoader(); loader.load('assets/json/helvetiker_regular.typeface.json', function(font){ var text = new THREE.TextGeometry('Hello, Three.js', { size: 24, height: 2, curveSegments: 5, font: font, weight: 'regular', style: ʻnormal', bevelThickness: 5, bevelSize: 1, bevelEnabled: true }); var material = new THREE.MeshStandardMaterial({color: 0x00ffff}); mesh = new THREE.Mesh(text, material); scene.add(mesh); });
![Page 19: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/19.jpg)
⽇本語フォントを扱うには
①サブセットフォントメーカーで 使う⽂字種を選定し、フォントファイルとして書き出す
②Facetype.js converterで ①にて書き出したフォントファイルをjson形式に⽣成
https://gero3.github.io/facetype.js/ http://opentype.jp/subsetfontmk.htm
![Page 20: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/20.jpg)
4. skydome/skyboxで背景演出
![Page 21: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/21.jpg)
three.jsの導⼊で作ったサンプル(3回⽬)
背景が寂しかったりしません?
![Page 22: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/22.jpg)
skydome/skyboxとは・・・
3D空間内で、空や周囲の⾵景を表現する⼿法。 skydomeとskyboxの違いは形状で、 前者が球体、後者が四⾯体を指している。 skydomeはSphereGeometryにパノラマサイズの画像を貼り付け、skyboxはBoxGeometryの各⾯に6⾯の画像を貼り付ける。
skyboxskydive
![Page 23: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/23.jpg)
// TextureLoaderで画像を読み込み後、skydomeを作成。 // レンダリング時にTHREE.BackSideで内側にレンダリング var skyBox; var geometry = new THREE.SphereGeometry(1600, 60, 40); var loader = new THREE.TextureLoader(); loader.load( './assets/img/tokyo.jpg', function(texture){ var material = new THREE.MeshBasicMaterial({ map: texture}); skyBox = new THREE.Mesh(geometry, material); skyBox.material.side = THREE.BackSide; scene.add(skyBox); } );
![Page 24: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/24.jpg)
5. 動的なマテリアル表現
![Page 25: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/25.jpg)
three.jsのマテリアル素材
three.jsのマテリアルは豊富で、画像をテクスチャとして 貼り付けることも可能。ではマテリアルを動的に切替えるには?
![Page 26: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/26.jpg)
GPU環境で動く、GLSLで記述されたシェーダーで レンダリングを⾏う。
対策:ShaderMaterialを使う http://threejs.org/docs/index.html#Reference/Materials/ShaderMaterial
![Page 27: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/27.jpg)
// Vertex(頂点), Fragment(フラグメント)のシェーダーを記述 // Vertex <script id="vertexShader" type="x-shader/x-vertex"> void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); } </script>
// Fragment <script id="fragmentShader" type="x-shader/x-fragment"> uniform vec3 diffuse; void main() { gl_FragColor = vec4(diffuse.x, diffuse.y, diffuse.z, 1.0); } </script>
![Page 28: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/28.jpg)
var uniforms = { // JSからシェーダーに送る設定値を記述 speed: { type: "f", value: 15.0 } };
// JS側でmaterial指定を⾏う箇所でShaderMaterialを使⽤ var geometry = new THREE.BoxGeometry(30, 30, 30); var material = new THREE.ShaderMaterial({ uniforms : uniforms, vertexShader : document.getElementById('vertexShader').text, fragmentShader : document.getElementById('fragmentShader').text, });
// 動的に値を変更する場合、アニメーションを⾏う箇所に記述 uniforms.speed.value = 10.0;
![Page 29: three.jsによる一歩進めたグラフィカルな表現](https://reader033.vdocuments.net/reader033/viewer/2022042508/587a27671a28abbd388b5485/html5/thumbnails/29.jpg)
three.jsで表現の幅を広げるには(1/2)
⾄極ありきたりではありますが、、
◆three.jsのサンプルを⾒て、写経する 最新バージョンに基づいた、基本的な書き⽅が載っている。 他サイトにも載っていたりするが、three.jsのバージョンが古かったりして、仕様上その書き⽅が使えなくなったり変わっていたりするので注意。
◆three.jsのサンプルから少しいじってみる 写経だと眠くなるので、元のサンプルのオブジェクトを変えてみたり、 サンプル同⼠を組み合わせるだけでも1から作るより⾒栄えが良い(オイオイ)
基礎的な部分だけでなく、 PostprocessingとかGPGPUといった ⾼度な表現系サンプルもあります