three.jsを使う
所要時間: 約 4分
WebGLを扱うためのJavaScriptのライブラリ
https://github.com/mrdoob/three.js.git
ダウンロード
git clone --depth=1 https://github.com/mrdoob/three.js.git
依存パッケージのインストール
cd three.js
npm install
開発サーバーの起動
npm start
Webブラウザで http://localhost:8080/examples/ にアクセスする
サンプルのソースを読んでみる
examples/canvas_morphtargets_horse.html
馬みたいなやつ
コンテナ要素作成
container = document.createElement( 'div' );
document.body.appendChild( container );
カメラ作成
aspect = window.innerWidth / window.innerHeight;
camera = new THREE.PerspectiveCamera(50, aspect, 1, 10000);
camera.position.y = 300;
var point = new THREE.Vector3(0, 0, 0);
camera.target = point;
シーン作成
scene = new THREE.Scene();
ライト作成
var light = new THREE.DirectionalLight( 0xefefff, 2 );
light.position.set( 1, 1, 1 ).normalize();
scene.add(light);
(ライトの設定は見栄えにかなり影響する)
モデルデータのロード
var data_path = '/js/horse.js';
var loader = new THREE.JSONLoader(true);
loader.load(data_path, function(geometry){
material = new THREE.MeshLambertMaterial( // 材質
{color: 0x606060,
morphTargets: true,
overdraw: 0.5
});
mesh = new THREE.Mesh(geometry, material); // メッシュ
mesh.scale.set(1.5, 1.5, 1.5);
scene.add(mesh);
});
レンダラーの作成
renderer = new THREE.CanvasRenderer();
renderer.setClearColor(0xf0f0f0);
renderer.setSize(window.innerWidth, window.innerHeight);
レンダラーのDOM要素を追加
container.appendChild(renderer.domElement);
ブラウザのサイズ変更時のハンドラ登録
window.addEventListener( 'resize', onWindowResize, false );
アスペクト比を設定
camera.aspect = window.innerWidth / window.innerHeight;
射影matrixを更新 (たぶんどう映るかという内部情報を更新)
camera.updateProjectionMatrix();
レンダラーサイズを設定
renderer.setSize( window.innerWidth, window.innerHeight );
フレームの描画更新の設定
requestAnimationFrame( animate );
render();
カメラの位置と向きを変更
theta += 0.1;
camera.position.x = radius * Math.sin( THREE.Math.degToRad( theta ) );
camera.position.z = radius * Math.cos( THREE.Math.degToRad( theta ) );
camera.lookAt(camera.target);
キーフレームの選択
if (mesh) {
var time = Date.now() % duration;
var keyframe = Math.floor( time / interpolation );
キーフレームが違っていたら有効なキーフレームを切り替える
if ( keyframe != currentKeyframe ) {
mesh.morphTargetInfluences[ lastKeyframe ] = 0; // 0にする事で無効になる
mesh.morphTargetInfluences[ currentKeyframe ] = 1; // 1にする事で有効になる
mesh.morphTargetInfluences[ keyframe ] = 0;
lastKeyframe = currentKeyframe;
currentKeyframe = keyframe;
}
mesh.morphTargetInfluences[ keyframe ] = ( time % interpolation ) / interpolation;
mesh.morphTargetInfluences[ lastKeyframe ] = 1 - mesh.morphTargetInfluences[ keyframe ];
}
renderer.render( scene, camera );
(モデリングもBlenderでやります)
まずはモデリング
Blenderを起動したら 真ん中の立方体を削除
fn+delete を押すとOK?と聞かれるので Deleteを選択してenter
スザンヌを追加 spaceを押してモーダルを出して “add monkey”とtypeしenter
作成したデータをthree.js用に出力
Three.jsのソースツリーからBlender用のpluginを探す
./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs
./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs/__init__.py
./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs/export_threejs.py
./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs/import_threejs.py
Blender用のpluginをBlenderのplugin用ディレクトリにコピー
cp ./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs Blender/blender.app/Contents/MacOS/2.68/scripts/addons/
cp ./utils/exporters/blender/2.65/scripts/addons/io_mesh_threejs $BLENDER_DIR -R
注) BLENDER_DIRはBlenderのplugin用ディレクトリに置き換えてください
1.「メニュー > File > User Preferences」を選択。 2. Addonsタブの ImportExportを選ぶ。 2. 右端のチェックをONにするとThree.js形式のデータの出力機能が有効になる。
エクスポートする。JSON形式で出力される。
エクスポートしたデータを 自分の作成したページに 表示させてみる
マウスでグルグルしたい
イベントハンドラ追加
function rotate_object(event) {
if ( mesh ) {
mesh.rotation.x = event.clientX / 10;
mesh.rotation.y = event.clientY / 10;
}
}
こんな処理の関数を document.addEventListener()で登録する
examples/js/controls/TrackballContorolls.js を読み込む必要有り
var trackball;
function init(){
〜省略〜
trackball = new THREE.TrackballControls(camera, renderer.domElement);
〜省略〜
}
〜省略〜
function render() {
trackball.update();
renderer.render(scene, camera);
}
rotate_object()はもういらない
みんなやろうよ three.js
元データ