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

D3.jsで日本地図を描いてみた
D3.jsで日本地図を描いてみたD3.jsで日本地図を描いてみた
D3.jsで日本地図を描いてみたmapquestIwasaki
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency InjectionNir Kaufman
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜Unity Technologies Japan K.K.
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しようUnityTechnologiesJapan002
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSYoshifumi Kawai
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5Tomo Mizoe
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)Yuki Tamura
 
Intents in Android
Intents in AndroidIntents in Android
Intents in Androidma-polimi
 
Introduction to React
Introduction to ReactIntroduction to React
Introduction to ReactRob Quick
 
Build the Virtual Reality Web with A-Frame
Build the Virtual Reality Web with A-FrameBuild the Virtual Reality Web with A-Frame
Build the Virtual Reality Web with A-FrameMozilla VR
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
Flutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by StepFlutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by StepChandramouli Biyyala
 

What's hot (20)

D3.jsで日本地図を描いてみた
D3.jsで日本地図を描いてみたD3.jsで日本地図を描いてみた
D3.jsで日本地図を描いてみた
 
WebGL and three.js
WebGL and three.jsWebGL and three.js
WebGL and three.js
 
Introduction to React JS
Introduction to React JSIntroduction to React JS
Introduction to React JS
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
React js
React jsReact js
React js
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSS
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
Training: MVVM Pattern
Training: MVVM PatternTraining: MVVM Pattern
Training: MVVM Pattern
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
 
Intents in Android
Intents in AndroidIntents in Android
Intents in Android
 
Introduction to React
Introduction to ReactIntroduction to React
Introduction to React
 
Build the Virtual Reality Web with A-Frame
Build the Virtual Reality Web with A-FrameBuild the Virtual Reality Web with A-Frame
Build the Virtual Reality Web with A-Frame
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
Angular.pdf
Angular.pdfAngular.pdf
Angular.pdf
 
Django
DjangoDjango
Django
 
Flutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by StepFlutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by Step
 

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

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Recently uploaded (9)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

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