three.jsでWebGLを始める
three.jsとは
WebGLを利用するためのJavaScriptライブラリ。
他にもAway3D.js、Babylon.js等が存在するが、中でもthree.jsは特に人気。
まずはDL↓
https://threejs.org
build 内 three.min.js を使用します。
表示させてみる
いきなりテクスチャ貼りの立方体の表示
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>three.js TEST</title>
<style>
*,body { margin: 0; padding: 0; }
</style>
</head>
<body>
<div id="stage"></div>
<script src="three.min.js"></script>
<script>
(function() {
  'use strict';
 
  var scene, light, camera;
  var box;
  var renderer;
  var width  = window.innerWidth;
  var height = window.innerHeight;
  var axis = undefined; // ガイド
  var grid = undefined; // ガイド
 
  // scene ステージ
  scene = new THREE.Scene();
 
  axis = new THREE.AxisHelper(1000);
  axis.position.set(0, 0, 0);
  grid = new THREE.GridHelper(100, 50);
  scene.add(grid);
 
  // light ライト
  light = new THREE.DirectionalLight(0xFFFFFF, 1); // 色、光の強さ
  light.position.set(0, 100, 30);
  scene.add(light);
 
  var loader = new THREE.TextureLoader();
 
  loader.load("texture.jpg", function(texture){
    createBox(texture); // mesh作成
    render();
  });
 
  function createBox(texture){
    box = new THREE.Mesh(
          new THREE.BoxGeometry(30, 30, 30),
          new THREE.MeshPhongMaterial({map: texture, color: 0x007eff})
    );
  box.castShadow = true;
    box.position.set(0, 15, 0);
    scene.add(box);
  }
 
  // camera カメラ
  camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
  camera.position.set(30, 30, 100);
  camera.lookAt(scene.position);
 
  // renderer レンダラー
  renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
  renderer.setSize(width, height);
  renderer.setClearColor(new THREE.Color(0xcccccc), 0);
  renderer.setPixelRatio(window.devicePixelRatio);
  document.getElementById('stage').appendChild(renderer.domElement);
 
  function render() {
    renderer.render(scene, camera);
  }
 
})();
</script>
</html>
まずjsにて設定するもの。
・scene
・light
・camera
・renderer
ステージを作成する
該当箇所及びコメント
// scene ステージ scene = new THREE.Scene(); // ステージを作成 /* 以下はガイドとしてグリッドを表示させるためのもの */ axis = new THREE.AxisHelper(1000); // x,y,z軸の作成 axis.position.set(0, 0, 0); // 軸のポジション grid = new THREE.GridHelper(100, 50); // グリッドの作成(サイズ, グリッドの大きさ) scene.add(grid); // グリッドをステージに追加
ライトを作成する
該当箇所及びコメント
// light ライト light = new THREE.DirectionalLight(0xFFFFFF, 1); // 16進数での色, 光の強さ light.position.set(0, 100, 30); // ライトの位置 scene.add(light); // ライトをステージに追加
ライトの種類
例ではDirectionalLightを使用しているが、他にも以下が設定可能。
| AmbientLight | 環境光。 散乱する光源によって、オブジェクトへのどの面へも一様に照らす。DirectionalLightにより光の当たらない部分への補助として使用することが多い。  | 
|---|---|
| DirectionalLight | 無限遠光源。 太陽光のような無限遠にある平行な光。オブジェクトの位置に関わらず、影の形は決定される。光源からの距離による光の減衰なし。  | 
| HemisphereLight | 半球光源。 AmbientLightに似ているが、上からの光の色と下からの光の色を分けられる。下からの光は反射光として、屋外での光の見え方に近い。  | 
| PointLight | 点光源。 単一点からあらゆる方向から放射される光源。例としては、裸電球。  | 
| SpotLight | スポットライト光源。 単一から一方向へ光を当てる光源。そのままスポットライトのような光源。  | 
| RectAreaLight | 矩形光源。 面を横切って短径平面に均一に放出される。窓のような光源。  | 
カメラを作成する
該当箇所及びコメント
// camera カメラ camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); // (画角, アスペクト比, 描画開始距離, 描画終了距離) camera.position.set(30, 30, 100); camera.lookAt(scene.position);
カメラの種類
例ではPerspectiveCameraを使用しているが、他にも以下が設定可能。
| PerspectiveCamera | 透視投影カメラ。 カメラからの距離によって遠近を表現。遠くにあるものほど小さく描画される、自然な見た目に近いカメラ。  | 
|---|---|
| OrthographicCamera | 平行投影カメラ。 カメラからの距離に関わらず、物体が同じ大きさで描画されるカメラ。  | 
| CubeCamera | 立方体カメラ。 オブジェクトのへの映り込み等、環境マッピングを行うためのカメラ。  | 
レンダラーを作成する
該当箇所及びコメント
  // renderer レンダラー
  renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true }); // alphaをtrueにすることで、setClearColorでの透過が有効に。antialiassetをtrueにすることで、PixelRatioでのRetina対応を有効に。
  renderer.setSize(width, height);                                      // 最初に設定したwidthとheight
  renderer.setClearColor(new THREE.Color(0xcccccc), 0);                 // 背景処理。canvasに対しcssで背景設定する場合は、2つめの引数を0にして透過させる。
  renderer.setPixelRatio(window.devicePixelRatio);                      // デバイスの解像度に設定することで、Retina対応。
  document.getElementById('stage').appendChild(renderer.domElement);    // HTML上の「id="stage"」の箇所へ反映させる
  
  function render() {
    renderer.render(scene, camera);                                     // ステージ、カメラのレンダリング
  }
オブジェクトを配置する
今回のテクスチャ。

該当箇所及びコメント
  var loader = new THREE.TextureLoader();        // テクスチャを利用するには、テクスチャをセットしてあげる。
  
  loader.load("texture.jpg", function(texture){      // テクスチャとして貼る画像をtextureに定義
    createBox(texture);                              // createBoxにtextureを反映させる
    render();
  });
  
  function createBox(texture){                       // createBox定義
    box = new THREE.Mesh(                            // boxをメッシュとして設定
          new THREE.BoxGeometry(30, 30, 30),         // BoxGeometryは立方体。幅, 高さ, 奥行
          new THREE.MeshPhongMaterial({map: texture, color: 0x007eff})  // テクスチャを貼り付ける, 基本となるボックスの色
    );
  box.castShadow = true;                           // 影を作成するか。これは、先述したカメラ設定にも依る。
    box.position.set(0, 15, 0);                      // ボックスの位置
    scene.add(box);                                  // ボックスをステージに追加
  }
オブジェクトについての説明はそのうちちゃんとできれば。
それで、

こんな感じのが表示される。
ライトやカメラ、デフォルトで用意されているオブジェクト(立方体や球体等)あたり、そのうちもうちょっと掘り下げて書きたい気もする。



