webのグラフィックス2016 webgl事例

40
Webのグラフィックス2016 前編1:WebGL事例 1

Upload: daisuke-shigyou

Post on 08-Jan-2017

1.153 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Webのグラフィックス2016 WebGL事例

Webのグラフィックス2016

前編1:WebGL事例

1

Page 2: Webのグラフィックス2016 WebGL事例

事例

2

パフォーマンス

WebGL2 Web VR

アンケート 「〇〇についてもっと詳しく知りたい」 ↓ WebGLのイベント考えます

Page 3: Webのグラフィックス2016 WebGL事例

WebGLを実務で 使ったことがある?

3

Page 4: Webのグラフィックス2016 WebGL事例

WebGLのイメージ これまで✤3Dコンテンツ

✤大規模コンテンツ

✤難しい

✤重い

4

Page 5: Webのグラフィックス2016 WebGL事例

WebGLのイメージ これから✤2Dの表現でもOK

✤ちょっとした表現でも使える

✤簡単に書くことも出来る

✤工夫次第で軽く

5

Page 6: Webのグラフィックス2016 WebGL事例

表現やコンテンツの幅を広げる選択肢の一つ

6

Page 7: Webのグラフィックス2016 WebGL事例

事例1 ちょっとした3D表現ドラゴンプロジェクト:武器防具下部 http://colopl.co.jp/dragonproject/weapon/#guard

7

Page 8: Webのグラフィックス2016 WebGL事例

導入の経緯✤デザイン提案 ✤動きのあるコンテンツで ✤いろんな装備のバリエーションを

Three.jsならいけるかも!

8

見せたい ✤開発時間に余裕なし

Page 9: Webのグラフィックス2016 WebGL事例

手順

9

Page 10: Webのグラフィックス2016 WebGL事例

手順✤WebGL(Three.js)を使う準備

9

Page 11: Webのグラフィックス2016 WebGL事例

手順✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む

9

Page 12: Webのグラフィックス2016 WebGL事例

手順✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間に六角柱を準備

9

Page 13: Webのグラフィックス2016 WebGL事例

手順✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間に六角柱を準備✤テクスチャを貼る

9

Page 14: Webのグラフィックス2016 WebGL事例

手順✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間に六角柱を準備✤テクスチャを貼る✤回す

9

Page 15: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 16: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 17: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 18: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 19: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 20: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 30; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setClearColor( 0x000000, 0 ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'texture_image2.png', function (texture) { var geometry = new THREE.CylinderGeometry( 14, 14, 20, 6, 1, true ); var material = new THREE.MeshBasicMaterial( { side : THREE.DoubleSide, transparent : true, map : texture, //alphaTest : 0.3, } ); ! var cylinder = new THREE.Mesh( geometry, material ); cylinder.rotation.y = Math.PI / 6; scene.add( cylinder ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); TWEEN.update(); renderer.render( scene, camera ); }; ! var flipTimer = setInterval(function(){ var angle = cylinder.rotation.y + Math.PI / 3; var tween = new TWEEN.Tween(cylinder.rotation).to({y:angle}, 400).easing(TWEEN.Easing.Exponential.InOut).start(); }, 3600); ! render(); });

10

Page 21: Webのグラフィックス2016 WebGL事例

ちょっとはまった (ざっくり説明します) ✤WebGLは描画順に上書きルール ✤透明なピクセルも上書きしてしまう ✤materialにalphaTest:0.3,追加

■alphaTest:数値(0~1.0) 数値以下のalphaのピクセルを 描画しなくする設定

11

透明ピクセルの描画に注意

Page 22: Webのグラフィックス2016 WebGL事例

ポイント

✤結構簡単:30分くらい ✤意外と軽い

小規模なものから始めると 徐々に覚えていける。

12

ハマり版 https://dl.dropboxusercontent.com/u/2732304/html5conf/ex/ex01_1.html

ハマり解決版 https://dl.dropboxusercontent.com/u/2732304/html5conf/ex/ex01_2.html

Page 23: Webのグラフィックス2016 WebGL事例

事例2 パーティクルでの演出ドラゴンプロジェクト:トップ http://colopl.co.jp/dragonproject/ 白猫プロジェクト:2周年サイト http://colopl.co.jp/shironekoproject/2nd_anniversary/sp/

13

Page 24: Webのグラフィックス2016 WebGL事例

導入の経緯:ドラプロ✤デザイン提案 ✤すこし複雑な動き ✤加算を使いたい ✤開発時間に余裕あり ✤なくても良いけどあるとより良い

Three.js+GLSLで やってみよう!

14

Page 25: Webのグラフィックス2016 WebGL事例

手順:簡易版

15

Page 26: Webのグラフィックス2016 WebGL事例

手順:簡易版✤WebGL(Three.js)を使う準備

15

Page 27: Webのグラフィックス2016 WebGL事例

手順:簡易版✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む

15

Page 28: Webのグラフィックス2016 WebGL事例

手順:簡易版✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間にランダム頂点を準備

15

Page 29: Webのグラフィックス2016 WebGL事例

手順:簡易版✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間にランダム頂点を準備✤頂点にテクスチャを貼る(加算設定)

15

Page 30: Webのグラフィックス2016 WebGL事例

手順:簡易版✤WebGL(Three.js)を使う準備✤テクスチャにする画像を読み込む✤空間にランダム頂点を準備✤頂点にテクスチャを貼る(加算設定)✤動かす

15

Page 31: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 32: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 33: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 34: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 35: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 36: Webのグラフィックス2016 WebGL事例

var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); camera.position.z = 100; !var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); !var textureLoader = new THREE.TextureLoader(); textureLoader.load( 'particle.png', function (texture) { var geometry = new THREE.Geometry(); for (var i = 0; i < count/2; i++) { var v1 = new THREE.Vector3(getRandomNum(), getRandomNum(), getRandomNum()); var v2 = new THREE.Vector3(v1.x, v1.y - 100.0, v1.z); geometry.vertices.push(v1); geometry.vertices.push(v2); } var material = new THREE.PointsMaterial( { map : texture, size : 3, blending : THREE.AdditiveBlending, transparent : true, depthTest : false, //color : 0XFF5B00, } ); ! var particles = new THREE.Points( geometry, material ); scene.add( particles ); ! document.body.appendChild( renderer.domElement ); ! var render = function (time) { requestAnimationFrame( render ); var yPos = particles.position.y; particles.position.y = (yPos > 100) ? 0 : yPos + 0.2; renderer.render( scene, camera ); }; ! render(); }); 16

Page 37: Webのグラフィックス2016 WebGL事例

ポイント

✤加算はブレンドモードの設定のみ ✤y軸 - で降る + で湧く、Z軸 + で

✤シェーダーを使えばもっと複雑に ✤描画範囲に注意

17

向かってくる - で過ぎていく

パーティクル簡易版 https://dl.dropboxusercontent.com/u/2732304/html5conf/ex/ex02.html

Page 38: Webのグラフィックス2016 WebGL事例

まとめ

✤ 始めるなら、ちいさなコンテンツから ✤ いきなり全てを理解はできない ✤ WebGL、そんなに難しくない(奥は深いけど ✤ WebGLを選択肢の一つとして加えてみよう

18

WebGLをつかってみましょう

Page 39: Webのグラフィックス2016 WebGL事例

WebGL事例サイト✤WebGL総本山

https://webgl.souhonzan.org/

✤ThreejsのGoogle+https://plus.google.com/+ThreejsOrg

19

Join webgl-jp on Slack https://arcane-depths-9129.herokuapp.com/

Page 40: Webのグラフィックス2016 WebGL事例

ありがとうございました

20