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); // ボックスをステージに追加 }
オブジェクトについての説明はそのうちちゃんとできれば。
それで、
こんな感じのが表示される。
ライトやカメラ、デフォルトで用意されているオブジェクト(立方体や球体等)あたり、そのうちもうちょっと掘り下げて書きたい気もする。