SlideShare a Scribd company logo
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)

[125]웹 성능 최적화에 필요한 브라우저의 모든 것
[125]웹 성능 최적화에 필요한 브라우저의 모든 것
NAVER D2
 
공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정
BJ Jang
 
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
Open Source Consulting
 
30 important-virtualization-vmware-interview-questions-with-answers
30 important-virtualization-vmware-interview-questions-with-answers
Latif Siddiqui
 
Node.js Basics
Node.js Basics
TheCreativedev Blog
 
Architecture des Systèmes Logiciels
Architecture des Systèmes Logiciels
Ghazouani Mahdi
 
Rapid json tutorial
Rapid json tutorial
Paul Myeongchan Kim
 
Chatterを使ったカスタムソーシャル
Chatterを使ったカスタムソーシャル
Salesforce Developers Japan
 
virtualisation.pptx
virtualisation.pptx
rejebwissal
 
Express JS
Express JS
Alok Guha
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
TonyCms
 
Javascript Arrow function
Javascript Arrow function
tanerochris
 
Cours Android
Cours Android
Anouar Chamsse-Eddine NA
 
XSLT presentation
XSLT presentation
Miguel Angel Teheran Garcia
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
Solid NodeJS with TypeScript, Jest & NestJS
Solid NodeJS with TypeScript, Jest & NestJS
Rafael Casuso Romate
 
jQuery for beginners
jQuery for beginners
Arulmurugan Rajaraman
 
Multithread & shared_ptr
Multithread & shared_ptr
내훈 정
 
1. Arrow Functions | JavaScript | ES6
1. Arrow Functions | JavaScript | ES6
pcnmtutorials
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
ENSET, Université Hassan II Casablanca
 
[125]웹 성능 최적화에 필요한 브라우저의 모든 것
[125]웹 성능 최적화에 필요한 브라우저의 모든 것
NAVER D2
 
공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정
BJ Jang
 
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
Open Source Consulting
 
30 important-virtualization-vmware-interview-questions-with-answers
30 important-virtualization-vmware-interview-questions-with-answers
Latif Siddiqui
 
Architecture des Systèmes Logiciels
Architecture des Systèmes Logiciels
Ghazouani Mahdi
 
virtualisation.pptx
virtualisation.pptx
rejebwissal
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
TonyCms
 
Javascript Arrow function
Javascript Arrow function
tanerochris
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
Solid NodeJS with TypeScript, Jest & NestJS
Solid NodeJS with TypeScript, Jest & NestJS
Rafael Casuso Romate
 
Multithread & shared_ptr
Multithread & shared_ptr
내훈 정
 
1. Arrow Functions | JavaScript | ES6
1. Arrow Functions | JavaScript | ES6
pcnmtutorials
 

Viewers also liked (20)

Introduction to WebGL and Three.js
Introduction to WebGL and Three.js
James Williams
 
HTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンス
Hajime Ogushi
 
HTML5とIE10とWindows 8
HTML5とIE10とWindows 8
Microsoft
 
Porky
Porky
puriketu99 --
 
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
Futomi Hatano
 
HTML Web Platform
HTML Web Platform
dynamis
 
実践Sass 後編
実践Sass 後編
kosei27
 
実践Sass 前編
実践Sass 前編
Azusa Tomita
 
HTML5時代のWebデザイン
HTML5時代のWebデザイン
masaaki komori
 
5. bleeding disorder
5. bleeding disorder
Whiteraven68
 
Health at a glance 2015
Health at a glance 2015
OECD Directorate for Employment, Labour and Social Affairs
 
Renaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson ppt
Greg Sill
 
Types of News Lead
Types of News Lead
Drew F
 
Oracle Sql Tuning
Oracle Sql Tuning
Chris Adkin
 
Starting small, thinking big
Starting small, thinking big
Oluyomi Ojo
 
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Canvas8
 
Breast Cancer
Breast Cancer
fondas vakalis
 
Collection and Conveyance of Water
Collection and Conveyance of Water
GAURAV. H .TANDON
 
Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012
philogb
 
fluid, electrolytes, acid base balance
fluid, electrolytes, acid base balance
twiggypiggy
 
Introduction to WebGL and Three.js
Introduction to WebGL and Three.js
James Williams
 
HTML5Conference2012 LT ピンチとチャンス
HTML5Conference2012 LT ピンチとチャンス
Hajime Ogushi
 
HTML5とIE10とWindows 8
HTML5とIE10とWindows 8
Microsoft
 
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
Futomi Hatano
 
HTML Web Platform
HTML Web Platform
dynamis
 
実践Sass 後編
実践Sass 後編
kosei27
 
HTML5時代のWebデザイン
HTML5時代のWebデザイン
masaaki komori
 
5. bleeding disorder
5. bleeding disorder
Whiteraven68
 
Renaissance vs. medieval art lesson ppt
Renaissance vs. medieval art lesson ppt
Greg Sill
 
Types of News Lead
Types of News Lead
Drew F
 
Oracle Sql Tuning
Oracle Sql Tuning
Chris Adkin
 
Starting small, thinking big
Starting small, thinking big
Oluyomi Ojo
 
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Canvas8
 
Collection and Conveyance of Water
Collection and Conveyance of Water
GAURAV. H .TANDON
 
Leaving Flatland: Getting Started with WebGL- SXSW 2012
Leaving Flatland: Getting Started with WebGL- SXSW 2012
philogb
 
fluid, electrolytes, acid base balance
fluid, electrolytes, acid base balance
twiggypiggy
 
Ad

Similar to WebGL and Three.js (20)

3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
Fujio Kojima
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
AdvancedTechNight
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
Eiji Kamiya
 
three.js はじめましょ
three.js はじめましょ
Hiroaki Okubo
 
Three.jsで3D気分
Three.jsで3D気分
Toshio Ehara
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
Yuichi Higuchi
 
はじめてのぽりごん
はじめてのぽりごん
naohito maeda
 
IbisPaintのOpenGLES2.0
IbisPaintのOpenGLES2.0
Eiji Kamiya
 
OpenGLプログラミング
OpenGLプログラミング
幸雄 村上
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
Ricardo Quesada
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
Yoichi Hirata
 
FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!
Kazuya Hiruma
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Atsushi Tadokoro
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
Katsutoshi Makino
 
Android OpenGL HandsOn
Android OpenGL HandsOn
Ikuo Tansho
 
Three.js使ってみた
Three.js使ってみた
晴哉 谷口
 
WebGL (Three.js) Code Lab - Intro. [ GTUG Girls 10th]
WebGL (Three.js) Code Lab - Intro. [ GTUG Girls 10th]
Yukio Andoh
 
coma Creators session vol.2
coma Creators session vol.2
Atsushi Tadokoro
 
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
Fujio Kojima
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
AdvancedTechNight
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
Eiji Kamiya
 
three.js はじめましょ
three.js はじめましょ
Hiroaki Okubo
 
Three.jsで3D気分
Three.jsで3D気分
Toshio Ehara
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
Yuichi Higuchi
 
はじめてのぽりごん
はじめてのぽりごん
naohito maeda
 
IbisPaintのOpenGLES2.0
IbisPaintのOpenGLES2.0
Eiji Kamiya
 
OpenGLプログラミング
OpenGLプログラミング
幸雄 村上
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
Ricardo Quesada
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
Yoichi Hirata
 
FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!
Kazuya Hiruma
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Atsushi Tadokoro
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
Katsutoshi Makino
 
Android OpenGL HandsOn
Android OpenGL HandsOn
Ikuo Tansho
 
Three.js使ってみた
Three.js使ってみた
晴哉 谷口
 
WebGL (Three.js) Code Lab - Intro. [ GTUG Girls 10th]
WebGL (Three.js) Code Lab - Intro. [ GTUG Girls 10th]
Yukio Andoh
 
coma Creators session vol.2
coma Creators session vol.2
Atsushi Tadokoro
 
Ad

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