SlideShare a Scribd company logo
1 of 183
Download to read offline
2012-09-08 Akihiro Oyamada

Saturday, September 8, 12
おやまだ あきひろ
             小山田 晃浩
             twiter@yomotsu
             株式会社ピクセルグリッド
             Microsoft MVP for IE




Saturday, September 8, 12
このセッションの流れ
       1. HTMLとグラフィックス技術

       2. WebGLとは

       3. Three.jsとは

       4. まとめ




Saturday, September 8, 12
Saturday, September 8, 12
<video>   <audio>       canvas




                             CSS3      WOFF          SVG
                                       (WebFonts)




                            WebGL     WebAudio


Saturday, September 8, 12
HTMLはグラフィクスの技術でもある




Saturday, September 8, 12
Las
                               t ye
                                   ar




Saturday, September 8, 12
Saturday, September 8, 12
Let's see some WebGL works




Saturday, September 8, 12
Saturday, September 8, 12
http://hexgl.bkcore.com/




http://www.tangent3d.co.uk/armada/webshows/rayceasar/exhibition/




http://stations.aeracode.org/




http://www.solar-system-explorer.com/




Saturday, September 8, 12
Webで3Dを描画する技術
       用途はいろいろ




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
GPUに直接つながるので高速




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
WebGLは標準技術




Saturday, September 8, 12
WebGLを書いてみよう




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
WebGLで描けるのは三角形と点と線




Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/
                        html5conf2012/1.html

Saturday, September 8, 12
<!doctype html>
      <html>                                                         //頂点
      <head>                                                         var vertices = new Float32Array([
      <meta charset="utf-8">                                            0.0, 0.5, 0.0,
      <title>webgl demo</title>                                        -0.5, -0.5, 0.0,
      <script>                                                          0.5, -0.5, 0.0
      document.addEventListener('DOMContentLoaded', function(){
        var canvas = document.querySelector('#glcanvas');            ]);
        var gl = canvas.getContext('experimental-webgl');            // 頂点の数
                                                                     var verticesLength = 3;
        var vShaderSource = [
          // gl_Position は同次座標系 vec4(x, y, z, w);                    // VBOを作成する
          'attribute vec4 a_Position;',                              var vertexBuffer = gl.createBuffer();
          'void main(){',
          ' gl_Position = a_Position;',                              // VBOをコンテキストにバインドしてカレントにする
          '}'                                                        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
        ].join('n');                                                // カレントのバッファー(VBO)にデータを転送する
                                                                     gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
        var fShaderSource = [
          // gl_FragColor は色 vec4(red, green, blur, alpha);           var a_Position = gl.getAttribLocation(gl.program,
          'void main(){',
          ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);',              'a_Position');
          '}'                                                         // a_Position変数にカレントのバッファーを割り当てる
        ].join('n');                                                 gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, 0,
                                                                    0);
        // 頂点シェーダーを作成する                                               // a_Position変数でのバッファーの割り当てを有効化する
        var vertexShader = gl.createShader(gl.VERTEX_SHADER);         gl.enableVertexAttribArray(a_Position);
        // 頂点シェーダーにソースコードを指定する
        gl.shaderSource(vertexShader, vShaderSource);                    // Canvasをクリアする色を設定する
        // 頂点シェーダーをコンパイルする                                               gl.clearColor(0.0, 0.0, 0.0, 1.0);
        gl.compileShader(vertexShader);                                  // Canvasをクリアする
                                                                         gl.clear(gl.COLOR_BUFFER_BIT);
        // フラグメントシェーダを作成する
        var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);    // 三角形(TRIANGLES)描画モードで0番目から
        // フラグメントシェーダーにソースコードを指定する
        gl.shaderSource(fragmentShader, fShaderSource);              // verticesLength個の頂点を描画
        // フラグメントシェーダをコンパイルする                                        gl.drawArrays(gl.TRIANGLES, 0, verticesLength);
        gl.compileShader(fragmentShader);
                                                                    }, false); // addEventLitener のおわり
        // シェーダープログラムを作成する
        var program = gl.createProgram();                           </script>
        // シェーダープログラムにコンパイルした各シェーダを追加する                             </head>
        gl.attachShader(program, vertexShader);                     <body>
        gl.attachShader(program, fragmentShader);
        // シェーダープログラムに追加されたシェーダをリンクする                               <canvas id="glcanvas" width="500" height="500"></canvas>
        gl.linkProgram(program);
        // ここまでで設定したシェーダープログラムを描画時に利用する                             </body>
        gl.useProgram(program);                                     </html>
        gl.program = program;




Saturday, September 8, 12
コードで何をしているのか




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
WebGLのながれ
       • 頂点情報の配列は...

       • Vertex Shaderで形になり

       • Flagment Shaderで色がつき

       • HTMLのcanvasに表示される




Saturday, September 8, 12
各shaderは、
       自分で用意しなければならない




Saturday, September 8, 12
shaderはGLSLという言語で書く




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
WebGLのながれ
       • Vertex Shaderソースを用意してコンパイル

       • Flagment Shaderソースを用意してコンパイル

       • それぞれをprogramに登録する




Saturday, September 8, 12
JavaScriptから情報を入力する




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
手順が多く、敷居が高い




Saturday, September 8, 12
でもThree.jsなら...!




Saturday, September 8, 12
Three.jsとは




Saturday, September 8, 12
Saturday, September 8, 12
http://mrdoob.github.com/three.js/

Saturday, September 8, 12
Three.jsとは
       • WebGLのラッパーライブラリー

       • 複雑な手順は必要ない

       • WebGLを直感的に使うことができる

       • Mr.doob氏が中心になりGitHub上で開発されている




Saturday, September 8, 12
Saturday, September 8, 12
http://www.webgl.com/

Saturday, September 8, 12
WebGL作例の多くが
       Three.jsを使用




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
書籍でも
       WebGLの合わせて解説される




Saturday, September 8, 12
Three.jsは
       WebGLにおけるjQuery




Saturday, September 8, 12
Three.jsのながれ




Saturday, September 8, 12
Three.jsの利用手順
       1. レンダラーをHTMLにappend(設置)

       2. シーンを作成

       3. カメラを配置

       4. ライトを配置

       5. モデルを配置

       6. 撮影



Saturday, September 8, 12
<script src="three.min.js"></script>
       <script>
         //ここにTHREE.jsを用いた描画の処理を書いていく
       </script>




Saturday, September 8, 12
window.addEventListener("DOMContentLoaded", function(){
         //描画領域の大きさに利用する
         var width = window.innerWidth;
         var height = window.innerHeight;

            //レンダラーを設定
            var renderer = new THREE.WebGLRenderer();
            //レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
Saturday, September 8, 12
window.addEventListener("DOMContentLoaded", function(){
         //描画領域の大きさに利用する
         var width = window.innerWidth;
         var height = window.innerHeight;

            //レンダラーを設定
            var renderer = new THREE.WebGLRenderer();
            //レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
Saturday, September 8, 12
window.addEventListener("DOMContentLoaded", function(){
         //描画領域の大きさに利用する
         var width = window.innerWidth;
         var height = window.innerHeight;

            //レンダラーを設定
            var renderer = new THREE.WebGLRenderer();
            //レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
//レンダラーのサイズは当初設定したwidthとheightと同じに
            renderer.setSize( width, height );
            //HTMLのbody要素直下の子要素としてレンダラーを追加
            document.body.appendChild( renderer.domElement );

            //シーンを設定
            var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
Saturday, September 8, 12
var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

            //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
            var geometry = new THREE.CubeGeometry(200, 200, 200);
Saturday, September 8, 12
var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

            //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
            var geometry = new THREE.CubeGeometry(200, 200, 200);
Saturday, September 8, 12
var scene = new THREE.Scene();

            //カメラを設定
            var fov = 80;
            var aspect = width / height;
            var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

            //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
            var geometry = new THREE.CubeGeometry(200, 200, 200);
Saturday, September 8, 12
var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
Saturday, September 8, 12
var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
Saturday, September 8, 12
var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
Saturday, September 8, 12
var near   = 1;
            var far = 1000;
            var camera =
            new THREE.PerspectiveCamera( fov, aspect, near, far );
            //カメラの位置を手前に500移動
            camera.position.z = 500;
            //カメラをシーンに追加
            scene.add( camera );

            //光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
Saturday, September 8, 12
//光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });


Saturday, September 8, 12
//光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });


Saturday, September 8, 12
//光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });


Saturday, September 8, 12
//光源を設定
            var directionalLight =
            new THREE.DirectionalLight( 0xffffff, 3 );
            directionalLight.position.z = 3;
            //光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });


Saturday, September 8, 12
//光源をシーンに追加
            scene.add( directionalLight );

         //横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });




Saturday, September 8, 12
//横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });




Saturday, September 8, 12
//横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });




Saturday, September 8, 12
//横幅、高さ、奥行きが200の立方体のジオメトリーを設定
         var geometry = new THREE.CubeGeometry(200, 200, 200);
         //マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });




Saturday, September 8, 12
//マテリアルを設定
         var material = new THREE.MeshLambertMaterial({color:
       0x660000});
         //メッシュを作成
         var cubeMesh = new THREE.Mesh( geometry, material);
         //メッシュをシーンに追加
         scene.add( cubeMesh );

         //レンダリング
         renderer.render( scene, camera );
       });




Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/
                        html5conf2012/2.html

Saturday, September 8, 12
正面から描画しているだけ...




Saturday, September 8, 12
カメラ、モデル、光源を動かし、
       連続でレンダリングする




Saturday, September 8, 12
var theta = 0;

       function anim(){
          var radian = theta * Math.PI / 180;
          cubeMesh.rotation.set( radian, radian, radian );
          theta++;
          renderer.render( scene, camera );
          requestAnimationFrame( anim );
       };

       anim();




Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/
                        html5conf2012/3.html

Saturday, September 8, 12
Three.jsは直感的




Saturday, September 8, 12
ほかにも、たくさんのAPIがある




Saturday, September 8, 12
便利なThree.jsのAPIs

    モデルを読み込む




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
THREE.collaraLoader




                             THREE.OBJLoader




Saturday, September 8, 12
THREE.collaraLoader




                             THREE.OBJLoader




Saturday, September 8, 12
Saturday, September 8, 12
https://github.com/mrdoob/
                        three.js/tree/master/examples/js/

Saturday, September 8, 12
<script src="three.js"></script>
       <script src="ColladaLoader.js"></script>




Saturday, September 8, 12
//collada loader
       var loader = new THREE.ColladaLoader();
       loader.options.convertUpAxis = true;
       loader.load( 'model.dae', function( collada ) {
         var dae = collada.scene;
         scene.add( dae );
       } );




Saturday, September 8, 12
//collada loader
       var loader = new THREE.ColladaLoader();
       loader.options.convertUpAxis = true;
       loader.load( 'model.dae', function( collada ) {
         var dae = collada.scene;
         scene.add( dae );
       } );




Saturday, September 8, 12
//collada loader
       var loader = new THREE.ColladaLoader();
       loader.options.convertUpAxis = true;
       loader.load( 'model.dae', function( collada ) {
         var dae = collada.scene;
         scene.add( dae );
       } );




Saturday, September 8, 12
//collada loader
       var loader = new THREE.ColladaLoader();
       loader.options.convertUpAxis = true;
       loader.load( 'model.dae', function( collada ) {
         var dae = collada.scene;
         scene.add( dae );
       } );




Saturday, September 8, 12
//collada loader
       var loader = new THREE.ColladaLoader();
       loader.options.convertUpAxis = true;
       loader.load( 'model.dae', function( collada ) {
         var dae = collada.scene;
         scene.add( dae );
       } );




Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/threejs-
                        examples/load_converted_MMD_models/

Saturday, September 8, 12
さまざまな loader
       • JSONLoader (recommend!)

       • ColladaLoader.js

       • OBJLoader.js

       • UTF8Loader.js

       • VTKLoader.js




Saturday, September 8, 12
便利なThree.jsのAPIs

    注視点を座標で決める




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
カメラの向き調整は大変




Saturday, September 8, 12
camera.lookAt( new THREE.Vector3( 0, 0, 0) );




Saturday, September 8, 12
Saturday, September 8, 12
lookAt なし   lookAt あり




Saturday, September 8, 12
lookAt なし             lookAt あり




                        http://yomotsu.github.com/
                        html5conf2012/4.html

Saturday, September 8, 12
便利なThree.jsのAPIs

    モデルをクリックしたい




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/threejs-
                        examples/ray_basic2/

Saturday, September 8, 12
Three.jsには便利なAPIが
       他にもたくさんある




Saturday, September 8, 12
Three.jsと組み合わせる

    JSライブラリーで機能補完




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
+ 物理演算エンジン(Physics engine)




Saturday, September 8, 12
Saturday, September 8, 12
Saturday, September 8, 12
Three.js             Physics engine
       表現の世界                物理法則の世界




          •形                 •形
          • 材質               • 大きさ
          • 光と影              • 重さ
          • 反射               •力
          • 特殊シェーダー          • 摩擦
                             • 衝突
Saturday, September 8, 12
Three.js             Physics engine
       表現の世界                物理法則の世界




          •形                 •形
          • 材質               • 大きさ
          • 光と影              • 重さ
          • 反射               •力
          • 特殊シェーダー          • 摩擦
                             • 衝突
Saturday, September 8, 12
Three.js                      Physics engine
       表現の世界                         物理法則の世界




                            • 重力で動いた座標
                            • 力によって動いた座標
                            • 動いたことによる衝突時の座標
                            etc...



Saturday, September 8, 12
おすすめのPhysics engine
       • Physijs + Ammo.js
          AmmoはC++のBulletから自動でJSに変換したライブラリ。1MBほどある。

          PhysijsはAmmoを使いやすくするラッパー。

       • cannon.js
          JSでゼロから作られたライブラリー。50KB以下でかなり軽量。開発途中。

       • box2dweb.js
          2D物理エンジン。box2dのJS版。box2.jsよりもメンテナンスされている。




Saturday, September 8, 12
Let's see some results
             • http://yomotsu.github.com/threejs-examples/
                cannonjs_control/
             • http://yomotsu.github.com/threejs-examples/
                box2dwebjs_ragdoll/




Saturday, September 8, 12
Three.jsと組み合わせる

    CSS 3D transform




Saturday, September 8, 12
Saturday, September 8, 12
http://dev.w3.org/csswg/css3-3d-transforms/



Saturday, September 8, 12
Saturday, September 8, 12
http://www.emagix.net/academic/mscs-
                        project/item/camera-sync-with-css3-and-
                        webgl-threejs

Saturday, September 8, 12
Saturday, September 8, 12
http://yomotsu.github.com/threejs-
                        examples/sync-with-css/

Saturday, September 8, 12
Three.jsと組み合わせる

    Web Audio API




Saturday, September 8, 12
Saturday, September 8, 12
http://airtightinteractive.com/
                        demos/js/reactive/

Saturday, September 8, 12
Three.jsと組み合わせる

    Media Capture




Saturday, September 8, 12
カメラと2D CanvasとWebGLでAR




Saturday, September 8, 12
Saturday, September 8, 12
http://fhtr.org/JSARToolKit/

Saturday, September 8, 12
まとめ




Saturday, September 8, 12
• HTMLはグラフィクスのための技術でもある




Saturday, September 8, 12
• WebGLは高速で描画できる

          • WebGL1.0はスタンダードな技術

          • JavaScriptとGLSLで書く

          • WebGLは学習コストがやや高い




Saturday, September 8, 12
• Three.jsはWebGLにおけるjQuery

          • Three.jsのコードは直感的な操作

          • Three.jsは組み合わせいろいろ




Saturday, September 8, 12
Webでの表現技術は
                            進歩している




Saturday, September 8, 12
3DCGプログラミングも
                            そのひとつ




Saturday, September 8, 12
any questions?
                                  twiter@yomotsu




Saturday, September 8, 12
Saturday, September 8, 12

More Related Content

What's hot (20)

Introduction to react_js
Introduction to react_jsIntroduction to react_js
Introduction to react_js
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
 
Redux workshop
Redux workshopRedux workshop
Redux workshop
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
WebGL and three.js
WebGL and three.jsWebGL and three.js
WebGL and three.js
 
React JS part 1
React JS part 1React JS part 1
React JS part 1
 
Reactjs
Reactjs Reactjs
Reactjs
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node js
 
React JS - Introduction
React JS - IntroductionReact JS - Introduction
React JS - Introduction
 
React js - The Core Concepts
React js - The Core ConceptsReact js - The Core Concepts
React js - The Core Concepts
 
An Introduction to Redux
An Introduction to ReduxAn Introduction to Redux
An Introduction to Redux
 
react redux.pdf
react redux.pdfreact redux.pdf
react redux.pdf
 
Introduction to ReactJS
Introduction to ReactJSIntroduction to ReactJS
Introduction to ReactJS
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
Tech Talk on ReactJS
Tech Talk on ReactJSTech Talk on ReactJS
Tech Talk on ReactJS
 
React and redux
React and reduxReact and redux
React and redux
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
React js
React jsReact js
React js
 
Angular routing
Angular routingAngular routing
Angular routing
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
 

Viewers also liked

Introduction to WebGL and Three.js
Introduction to WebGL and Three.jsIntroduction to WebGL and Three.js
Introduction to WebGL and Three.jsJames Williams
 
HTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンスHTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンスHajime Ogushi
 
HTML5とIE10とWindows 8
HTML5とIE10とWindows 8HTML5とIE10とWindows 8
HTML5とIE10とWindows 8Microsoft
 
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012Futomi Hatano
 
HTML Web Platform
HTML Web PlatformHTML Web Platform
HTML Web Platformdynamis
 
実践Sass 後編
実践Sass 後編実践Sass 後編
実践Sass 後編kosei27
 
HTML5時代のWebデザイン
HTML5時代のWebデザインHTML5時代のWebデザイン
HTML5時代のWebデザインmasaaki komori
 
5. bleeding disorder
5. bleeding disorder5. bleeding disorder
5. bleeding disorderWhiteraven68
 
Renaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson pptRenaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson pptGreg Sill
 
Types of News Lead
Types of News LeadTypes of News Lead
Types of News LeadDrew F
 
Oracle Sql Tuning
Oracle Sql TuningOracle Sql Tuning
Oracle Sql TuningChris Adkin
 
Starting small, thinking big
Starting small, thinking bigStarting small, thinking big
Starting small, thinking bigOluyomi Ojo
 
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8Canvas8
 
Collection and Conveyance of Water
Collection and Conveyance of WaterCollection and Conveyance of Water
Collection and Conveyance of WaterGAURAV. H .TANDON
 
Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012philogb
 
fluid, electrolytes, acid base balance
fluid, electrolytes, acid base balancefluid, electrolytes, acid base balance
fluid, electrolytes, acid base balancetwiggypiggy
 

Viewers also liked (20)

Introduction to WebGL and Three.js
Introduction to WebGL and Three.jsIntroduction to WebGL and Three.js
Introduction to WebGL and Three.js
 
HTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンスHTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンス
 
HTML5とIE10とWindows 8
HTML5とIE10とWindows 8HTML5とIE10とWindows 8
HTML5とIE10とWindows 8
 
Porky
PorkyPorky
Porky
 
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
 
HTML Web Platform
HTML Web PlatformHTML Web Platform
HTML Web Platform
 
実践Sass 後編
実践Sass 後編実践Sass 後編
実践Sass 後編
 
実践Sass 前編
実践Sass 前編実践Sass 前編
実践Sass 前編
 
HTML5時代のWebデザイン
HTML5時代のWebデザインHTML5時代のWebデザイン
HTML5時代のWebデザイン
 
5. bleeding disorder
5. bleeding disorder5. bleeding disorder
5. bleeding disorder
 
Health at a glance 2015
Health at a glance 2015Health at a glance 2015
Health at a glance 2015
 
Renaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson pptRenaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson ppt
 
Types of News Lead
Types of News LeadTypes of News Lead
Types of News Lead
 
Oracle Sql Tuning
Oracle Sql TuningOracle Sql Tuning
Oracle Sql Tuning
 
Starting small, thinking big
Starting small, thinking bigStarting small, thinking big
Starting small, thinking big
 
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
 
Breast Cancer
Breast CancerBreast Cancer
Breast Cancer
 
Collection and Conveyance of Water
Collection and Conveyance of WaterCollection and Conveyance of Water
Collection and Conveyance of Water
 
Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012
 
fluid, electrolytes, acid base balance
fluid, electrolytes, acid base balancefluid, electrolytes, acid base balance
fluid, electrolytes, acid base balance
 

Similar to WebGL and Three.js

3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めようAdvancedTechNight
 
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~Fujio Kojima
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング幸雄 村上
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングAtsushi Tadokoro
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enRicardo Quesada
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップYasuhito Yabe
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!Yuichi Higuchi
 
はじめてのぽりごん
はじめてのぽりごんはじめてのぽりごん
はじめてのぽりごんnaohito maeda
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイドYuichi Sakuraba
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)崇之 清水
 

Similar to WebGL and Three.js (20)

3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
HTML5 on ASP.NET
HTML5 on ASP.NETHTML5 on ASP.NET
HTML5 on ASP.NET
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
 
Tamabi media131118
Tamabi media131118Tamabi media131118
Tamabi media131118
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
sgvizler
sgvizlersgvizler
sgvizler
 
Cocos2d Shaders
Cocos2d ShadersCocos2d Shaders
Cocos2d Shaders
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
 
はじめてのぽりごん
はじめてのぽりごんはじめてのぽりごん
はじめてのぽりごん
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
G * magazine 1
G * magazine 1G * magazine 1
G * magazine 1
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
 
電子国土Part2
電子国土Part2電子国土Part2
電子国土Part2
 

Recently uploaded

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (9)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

WebGL and Three.js

  • 2. おやまだ あきひろ 小山田 晃浩 twiter@yomotsu 株式会社ピクセルグリッド Microsoft MVP for IE Saturday, September 8, 12
  • 3. このセッションの流れ 1. HTMLとグラフィックス技術 2. WebGLとは 3. Three.jsとは 4. まとめ Saturday, September 8, 12
  • 5. <video> <audio> canvas CSS3 WOFF SVG (WebFonts) WebGL WebAudio Saturday, September 8, 12
  • 7. Las t ye ar Saturday, September 8, 12
  • 9. Let's see some WebGL works Saturday, September 8, 12
  • 12. Webで3Dを描画する技術 用途はいろいろ Saturday, September 8, 12
  • 31. http://yomotsu.github.com/ html5conf2012/1.html Saturday, September 8, 12
  • 32. <!doctype html> <html> //頂点 <head> var vertices = new Float32Array([ <meta charset="utf-8"> 0.0, 0.5, 0.0, <title>webgl demo</title> -0.5, -0.5, 0.0, <script> 0.5, -0.5, 0.0 document.addEventListener('DOMContentLoaded', function(){ var canvas = document.querySelector('#glcanvas'); ]); var gl = canvas.getContext('experimental-webgl'); // 頂点の数 var verticesLength = 3; var vShaderSource = [ // gl_Position は同次座標系 vec4(x, y, z, w); // VBOを作成する 'attribute vec4 a_Position;', var vertexBuffer = gl.createBuffer(); 'void main(){', ' gl_Position = a_Position;', // VBOをコンテキストにバインドしてカレントにする '}' gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); ].join('n'); // カレントのバッファー(VBO)にデータを転送する gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); var fShaderSource = [ // gl_FragColor は色 vec4(red, green, blur, alpha); var a_Position = gl.getAttribLocation(gl.program, 'void main(){', ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);', 'a_Position'); '}' // a_Position変数にカレントのバッファーを割り当てる ].join('n'); gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, 0, 0); // 頂点シェーダーを作成する // a_Position変数でのバッファーの割り当てを有効化する var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.enableVertexAttribArray(a_Position); // 頂点シェーダーにソースコードを指定する gl.shaderSource(vertexShader, vShaderSource); // Canvasをクリアする色を設定する // 頂点シェーダーをコンパイルする gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.compileShader(vertexShader); // Canvasをクリアする gl.clear(gl.COLOR_BUFFER_BIT); // フラグメントシェーダを作成する var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); // 三角形(TRIANGLES)描画モードで0番目から // フラグメントシェーダーにソースコードを指定する gl.shaderSource(fragmentShader, fShaderSource); // verticesLength個の頂点を描画 // フラグメントシェーダをコンパイルする gl.drawArrays(gl.TRIANGLES, 0, verticesLength); gl.compileShader(fragmentShader); }, false); // addEventLitener のおわり // シェーダープログラムを作成する var program = gl.createProgram(); </script> // シェーダープログラムにコンパイルした各シェーダを追加する </head> gl.attachShader(program, vertexShader); <body> gl.attachShader(program, fragmentShader); // シェーダープログラムに追加されたシェーダをリンクする <canvas id="glcanvas" width="500" height="500"></canvas> gl.linkProgram(program); // ここまでで設定したシェーダープログラムを描画時に利用する </body> gl.useProgram(program); </html> gl.program = program; Saturday, September 8, 12
  • 41. WebGLのながれ • 頂点情報の配列は... • Vertex Shaderで形になり • Flagment Shaderで色がつき • HTMLのcanvasに表示される Saturday, September 8, 12
  • 42. 各shaderは、 自分で用意しなければならない Saturday, September 8, 12
  • 50. WebGLのながれ • Vertex Shaderソースを用意してコンパイル • Flagment Shaderソースを用意してコンパイル • それぞれをprogramに登録する Saturday, September 8, 12
  • 64. Three.jsとは • WebGLのラッパーライブラリー • 複雑な手順は必要ない • WebGLを直感的に使うことができる • Mr.doob氏が中心になりGitHub上で開発されている Saturday, September 8, 12
  • 67. WebGL作例の多くが Three.jsを使用 Saturday, September 8, 12
  • 70. 書籍でも WebGLの合わせて解説される Saturday, September 8, 12
  • 71. Three.jsは WebGLにおけるjQuery Saturday, September 8, 12
  • 73. Three.jsの利用手順 1. レンダラーをHTMLにappend(設置) 2. シーンを作成 3. カメラを配置 4. ライトを配置 5. モデルを配置 6. 撮影 Saturday, September 8, 12
  • 74. <script src="three.min.js"></script> <script> //ここにTHREE.jsを用いた描画の処理を書いていく </script> Saturday, September 8, 12
  • 75. window.addEventListener("DOMContentLoaded", function(){ //描画領域の大きさに利用する var width = window.innerWidth; var height = window.innerHeight; //レンダラーを設定 var renderer = new THREE.WebGLRenderer(); //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 Saturday, September 8, 12
  • 76. window.addEventListener("DOMContentLoaded", function(){ //描画領域の大きさに利用する var width = window.innerWidth; var height = window.innerHeight; //レンダラーを設定 var renderer = new THREE.WebGLRenderer(); //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 Saturday, September 8, 12
  • 77. window.addEventListener("DOMContentLoaded", function(){ //描画領域の大きさに利用する var width = window.innerWidth; var height = window.innerHeight; //レンダラーを設定 var renderer = new THREE.WebGLRenderer(); //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = Saturday, September 8, 12
  • 78. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 79. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 80. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 81. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 82. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 83. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 84. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 85. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 86. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 87. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 88. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 89. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 90. //レンダラーのサイズは当初設定したwidthとheightと同じに renderer.setSize( width, height ); //HTMLのbody要素直下の子要素としてレンダラーを追加 document.body.appendChild( renderer.domElement ); //シーンを設定 var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); Saturday, September 8, 12
  • 91. var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); Saturday, September 8, 12
  • 92. var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); Saturday, September 8, 12
  • 93. var scene = new THREE.Scene(); //カメラを設定 var fov = 80; var aspect = width / height; var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); Saturday, September 8, 12
  • 94. var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 Saturday, September 8, 12
  • 95. var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 Saturday, September 8, 12
  • 96. var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 Saturday, September 8, 12
  • 97. var near = 1; var far = 1000; var camera = new THREE.PerspectiveCamera( fov, aspect, near, far ); //カメラの位置を手前に500移動 camera.position.z = 500; //カメラをシーンに追加 scene.add( camera ); //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 Saturday, September 8, 12
  • 98. //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 99. //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 100. //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 101. //光源を設定 var directionalLight = new THREE.DirectionalLight( 0xffffff, 3 ); directionalLight.position.z = 3; //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 102. //光源をシーンに追加 scene.add( directionalLight ); //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 103. //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 104. //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 105. //横幅、高さ、奥行きが200の立方体のジオメトリーを設定 var geometry = new THREE.CubeGeometry(200, 200, 200); //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 106. //マテリアルを設定 var material = new THREE.MeshLambertMaterial({color: 0x660000}); //メッシュを作成 var cubeMesh = new THREE.Mesh( geometry, material); //メッシュをシーンに追加 scene.add( cubeMesh ); //レンダリング renderer.render( scene, camera ); }); Saturday, September 8, 12
  • 108. http://yomotsu.github.com/ html5conf2012/2.html Saturday, September 8, 12
  • 110. カメラ、モデル、光源を動かし、 連続でレンダリングする Saturday, September 8, 12
  • 111. var theta = 0; function anim(){ var radian = theta * Math.PI / 180; cubeMesh.rotation.set( radian, radian, radian ); theta++; renderer.render( scene, camera ); requestAnimationFrame( anim ); }; anim(); Saturday, September 8, 12
  • 113. http://yomotsu.github.com/ html5conf2012/3.html Saturday, September 8, 12
  • 116. 便利なThree.jsのAPIs モデルを読み込む Saturday, September 8, 12
  • 119. THREE.collaraLoader THREE.OBJLoader Saturday, September 8, 12
  • 120. THREE.collaraLoader THREE.OBJLoader Saturday, September 8, 12
  • 122. https://github.com/mrdoob/ three.js/tree/master/examples/js/ Saturday, September 8, 12
  • 123. <script src="three.js"></script> <script src="ColladaLoader.js"></script> Saturday, September 8, 12
  • 124. //collada loader var loader = new THREE.ColladaLoader(); loader.options.convertUpAxis = true; loader.load( 'model.dae', function( collada ) { var dae = collada.scene; scene.add( dae ); } ); Saturday, September 8, 12
  • 125. //collada loader var loader = new THREE.ColladaLoader(); loader.options.convertUpAxis = true; loader.load( 'model.dae', function( collada ) { var dae = collada.scene; scene.add( dae ); } ); Saturday, September 8, 12
  • 126. //collada loader var loader = new THREE.ColladaLoader(); loader.options.convertUpAxis = true; loader.load( 'model.dae', function( collada ) { var dae = collada.scene; scene.add( dae ); } ); Saturday, September 8, 12
  • 127. //collada loader var loader = new THREE.ColladaLoader(); loader.options.convertUpAxis = true; loader.load( 'model.dae', function( collada ) { var dae = collada.scene; scene.add( dae ); } ); Saturday, September 8, 12
  • 128. //collada loader var loader = new THREE.ColladaLoader(); loader.options.convertUpAxis = true; loader.load( 'model.dae', function( collada ) { var dae = collada.scene; scene.add( dae ); } ); Saturday, September 8, 12
  • 130. http://yomotsu.github.com/threejs- examples/load_converted_MMD_models/ Saturday, September 8, 12
  • 131. さまざまな loader • JSONLoader (recommend!) • ColladaLoader.js • OBJLoader.js • UTF8Loader.js • VTKLoader.js Saturday, September 8, 12
  • 132. 便利なThree.jsのAPIs 注視点を座標で決める Saturday, September 8, 12
  • 137. camera.lookAt( new THREE.Vector3( 0, 0, 0) ); Saturday, September 8, 12
  • 139. lookAt なし lookAt あり Saturday, September 8, 12
  • 140. lookAt なし lookAt あり http://yomotsu.github.com/ html5conf2012/4.html Saturday, September 8, 12
  • 141. 便利なThree.jsのAPIs モデルをクリックしたい Saturday, September 8, 12
  • 148. http://yomotsu.github.com/threejs- examples/ray_basic2/ Saturday, September 8, 12
  • 149. Three.jsには便利なAPIが 他にもたくさんある Saturday, September 8, 12
  • 150. Three.jsと組み合わせる JSライブラリーで機能補完 Saturday, September 8, 12
  • 157. Three.js Physics engine 表現の世界 物理法則の世界 •形 •形 • 材質 • 大きさ • 光と影 • 重さ • 反射 •力 • 特殊シェーダー • 摩擦 • 衝突 Saturday, September 8, 12
  • 158. Three.js Physics engine 表現の世界 物理法則の世界 •形 •形 • 材質 • 大きさ • 光と影 • 重さ • 反射 •力 • 特殊シェーダー • 摩擦 • 衝突 Saturday, September 8, 12
  • 159. Three.js Physics engine 表現の世界 物理法則の世界 • 重力で動いた座標 • 力によって動いた座標 • 動いたことによる衝突時の座標 etc... Saturday, September 8, 12
  • 160. おすすめのPhysics engine • Physijs + Ammo.js AmmoはC++のBulletから自動でJSに変換したライブラリ。1MBほどある。 PhysijsはAmmoを使いやすくするラッパー。 • cannon.js JSでゼロから作られたライブラリー。50KB以下でかなり軽量。開発途中。 • box2dweb.js 2D物理エンジン。box2dのJS版。box2.jsよりもメンテナンスされている。 Saturday, September 8, 12
  • 161. Let's see some results • http://yomotsu.github.com/threejs-examples/ cannonjs_control/ • http://yomotsu.github.com/threejs-examples/ box2dwebjs_ragdoll/ Saturday, September 8, 12
  • 162. Three.jsと組み合わせる CSS 3D transform Saturday, September 8, 12
  • 166. http://www.emagix.net/academic/mscs- project/item/camera-sync-with-css3-and- webgl-threejs Saturday, September 8, 12
  • 168. http://yomotsu.github.com/threejs- examples/sync-with-css/ Saturday, September 8, 12
  • 169. Three.jsと組み合わせる Web Audio API Saturday, September 8, 12
  • 171. http://airtightinteractive.com/ demos/js/reactive/ Saturday, September 8, 12
  • 172. Three.jsと組み合わせる Media Capture Saturday, September 8, 12
  • 178. • WebGLは高速で描画できる • WebGL1.0はスタンダードな技術 • JavaScriptとGLSLで書く • WebGLは学習コストがやや高い Saturday, September 8, 12
  • 179. • Three.jsはWebGLにおけるjQuery • Three.jsのコードは直感的な操作 • Three.jsは組み合わせいろいろ Saturday, September 8, 12
  • 180. Webでの表現技術は 進歩している Saturday, September 8, 12
  • 181. 3DCGプログラミングも そのひとつ Saturday, September 8, 12
  • 182. any questions? twiter@yomotsu Saturday, September 8, 12