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

PDF
ODP
Introduction to threejs
PDF
Three.js basics
PPTX
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
PDF
Solid NodeJS with TypeScript, Jest & NestJS
PDF
Redux Saga - Under the hood
PPTX
The redux saga begins
PPTX
UI아트 작업자를 위한 언리얼엔진4 UMG #1
Introduction to threejs
Three.js basics
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
Solid NodeJS with TypeScript, Jest & NestJS
Redux Saga - Under the hood
The redux saga begins
UI아트 작업자를 위한 언리얼엔진4 UMG #1

What's hot (20)

PDF
나만의 엔진 개발하기
PDF
NestJS
PDF
빠른 렌더링을 위한 오브젝트 제외 기술
PPTX
모바일게임 1인 QA 업무 경험담
PDF
WebAssembly Overview
PDF
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
PDF
MongoDB Aggregation Framework
PDF
Ngrx slides
PPTX
Angular Data Binding
PPTX
Avoiding callback hell in Node js using promises
ODP
Basics of VueJS
PDF
Nestjs MasterClass Slides
PPTX
Introduction to microservices
PDF
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
PDF
Windows Registered I/O (RIO) vs IOCP
PDF
OIT to Volumetric Shadow Mapping, 101 Uses for Raster-Ordered Views using Dir...
PDF
Angular & RXJS: examples and use cases
PDF
중앙 서버 없는 게임 로직
PDF
[132] rust
PDF
Angular - Chapter 4 - Data and Event Handling
나만의 엔진 개발하기
NestJS
빠른 렌더링을 위한 오브젝트 제외 기술
모바일게임 1인 QA 업무 경험담
WebAssembly Overview
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
MongoDB Aggregation Framework
Ngrx slides
Angular Data Binding
Avoiding callback hell in Node js using promises
Basics of VueJS
Nestjs MasterClass Slides
Introduction to microservices
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
Windows Registered I/O (RIO) vs IOCP
OIT to Volumetric Shadow Mapping, 101 Uses for Raster-Ordered Views using Dir...
Angular & RXJS: examples and use cases
중앙 서버 없는 게임 로직
[132] rust
Angular - Chapter 4 - Data and Event Handling
Ad

Viewers also liked (20)

KEY
Introduction to WebGL and Three.js
PDF
HTML5Conference2012 LT ピンチとチャンス
PDF
HTML5とIE10とWindows 8
KEY
PDF
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
PDF
HTML Web Platform
ZIP
実践Sass 後編
ZIP
実践Sass 前編
PDF
HTML5時代のWebデザイン
PPTX
5. bleeding disorder
PPT
Renaissance vs. medieval art lesson ppt
PPTX
Types of News Lead
PPT
Oracle Sql Tuning
PDF
Starting small, thinking big
PDF
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
PPT
Breast Cancer
PPTX
Collection and Conveyance of Water
PDF
Leaving Flatland: Getting Started with WebGL- SXSW 2012
PPT
fluid, electrolytes, acid base balance
Introduction to WebGL and Three.js
HTML5Conference2012 LT ピンチとチャンス
HTML5とIE10とWindows 8
HTML5マークアップ珍プレー集 - HTML5 Conference 2012
HTML Web Platform
実践Sass 後編
実践Sass 前編
HTML5時代のWebデザイン
5. bleeding disorder
Renaissance vs. medieval art lesson ppt
Types of News Lead
Oracle Sql Tuning
Starting small, thinking big
Consumer Trends in 2016: 36 Expert Perspectives - Canvas8
Breast Cancer
Collection and Conveyance of Water
Leaving Flatland: Getting Started with WebGL- SXSW 2012
fluid, electrolytes, acid base balance
Ad

Similar to WebGL and Three.js (20)

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

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