株式会社プランニングA

コラム

column
2016.07.25

クリエイティブ・ラボ vol.13 three.jsで行う3D表現

弊社のWEBサイトのトップページはthree.js(http://threejs.org/)という、WEBブラウザーで3D表現が行えるjavascriptのライブラリーを使用しています。
(※残念ながらインターネットエクスプローラーでは動作が安定しないため3Dではありません。)
以前はWEBブラウザー上で動きのあるWEBサイトを作る場合、Flashなどが使用されていましたが、スマートフォンでFlashがサポートされなくなったこともあり、javascriptを使うことが多くなっています。
three.jsはthree.jsのWEBサイトを見てもらうとわかるのですが、3Dでの多彩な表現事例が数多く載っています。ブラウザーでここまでできるのかと驚くばかりです。

今回サンプルとしてthree.jsで簡単なものを作成しjavascript部分を全行コメントしてみました。

あらかじめ、three.jsとマウスで動かすためのOrbitControls.jsを読み込んでおきます。

(function(){

//シーンの作成
var scene = new THREE.Scene();

//画面上にある座表軸の線の定義
var axisHelper = new THREE.AxisHelper(1000);

//座標軸の線を置く場所
axisHelper.position.set(0, 0, 0 );

//シーンに置く
scene.add( axisHelper );

//■■■■■■■■■■■■■■■■■■■ 物体1 ■■■■■■■■■■■■■■■■■■■
//四角いボックスを定義
var geometry = new THREE.BoxGeometry( 10, 10, 10 );

//塗る赤い色を定義
var material = new THREE.MeshLambertMaterial( {color: “red”} );

//cubeと名付けて上で定義した形と色を指定
var cube = new THREE.Mesh( geometry, material );

//影をつける
cube.castShadow = true;

//場所を指定
cube.position.set(0,10,0);

//シーンに置く
scene.add( cube );

//■■■■■■■■■■■■■■■■■■■ 物体2 ■■■■■■■■■■■■■■■■■■■
//丸を定義
var geometry = new THREE.SphereGeometry( 5, 32, 32 );

//塗る色を指定
var material = new THREE.MeshLambertMaterial( {color: 0x00eecf} );

//sphereと名前をつけて定義した丸い形と色を指定
var sphere = new THREE.Mesh( geometry, material );

//影をつけましたつける
sphere.castShadow = true;

//場所を指定
sphere.position.set(20,10,0);

//シーンに置く
scene.add( sphere );

//■■■■■■■■■■■■■■■■■■■ 地面 ■■■■■■■■■■■■■■■■■■■
//地面を作るため平面を定義
var geometry = new THREE.PlaneGeometry( 100, 100, 1 );

//色を定義
var material = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );

//planeと名付けて定義した丸い形と色を指定
var plane = new THREE.Mesh( geometry, material );

//影をつける
plane.receiveShadow = true;

//そのままだと壁になるので90回転
plane.rotation.x=90*Math.PI /180;

//シーンに置く
scene.add( plane );

//■■■■■■■■■■■■■■■■■■■ カメラ ■■■■■■■■■■■■■■■■■■■
//カメラの横幅
var width= 1500;

//カメラの縦幅
var height = 1000;

//カメラの画角
var fov= 5;

//アスペクト比
var aspect = width / height;

//見える範囲の始め
var near = 1;

//見える範囲の終わり
var far= 1000;

//カメラの定義
var camera = new THREE.PerspectiveCamera( fov, aspect, near, far );

//カメラ位置
camera.position.set( 300, 300, 700 );

//カメラをcubeに向ける
camera.lookAt(cube.position);


//■■■■■■■■■■■■■■■■■■■ ライト ■■■■■■■■■■■■■■■■■■■
//カメラの定義
var directionalLight = new THREE.DirectionalLight( 0xffffff, 2, 0);
//影を出す
directionalLight.castShadow = true;
//カメラ位置
directionalLight.position.set( 0, 100, 30 );
//カメラを置く
scene.add( directionalLight );

//■■■■■■■■■■■■■■■■■■■ 環境光 ■■■■■■■■■■■■■■■■■■■
//環境光の定義
var ambientlight = new THREE.AmbientLight( 0x404040 ); 

//環境光を置く
scene.add( ambientlight );

//■■■■■■■■■■■■■■■■■■■ レンダラー ■■■■■■■■■■■■■■■■■■■
//今回はWebGLRendererを使用
var renderer = new THREE.WebGLRenderer();

//レンダラーのサイズ
renderer.setSize(500, 500);

//レンダラーの色
renderer.setClearColor(0xffffff,1);

//影を有効にする
renderer.shadowMapEnabled = true;

//div#stageに置く
document.getElementById(‘stage’).appendChild(renderer.domElement);

//■■■■■■■■■■■■■■■■■■■ マウスコントロール ■■■■■■■■■■■■■■■■■■■

//読み込んでるOrbitControlsを使用できるようにしてます。
var controls = new THREE.OrbitControls(camera,renderer.domElement);

//■■■■■■■■■■■■■■■■■■■ アニメーション ■■■■■■■■■■■■■■■■■■■

function render () {
//アニメーション開始

requestAnimationFrame(render);
    //cubeをサインコサインで丸く回してます。
cube.position.x += Math.sin(new Date().getTime() / 500) *1;
cube.position.z += Math.cos(new Date().getTime() / 500) *1;

//シーンとカメラをレンダラーに
renderer.render(scene,camera);
}

//実行
render();

})();

お困りのことがございましたら
お気軽にご相談ください

結果につながる広告制作は
プランニングAへおまかせください。

contact