// *************************************************
// Three.js の環境設定
// *************************************************
var SCREEN_WIDTH = window.innerWidth * 0.98;
var SCREEN_HEIGHT = window.innerHeight * 0.98;
var SCREEN_WIDTH_HALF = SCREEN_WIDTH / 2;
var SCREEN_HEIGHT_HALF = SCREEN_HEIGHT / 2;
var camera, scene, renderer,
birds, bird;
var boid, boids;
var stats;
// お決まりの初期処理とアニメーション開始
init();
// animate 内の render が実行されても、init の処理が完了していないと描画されません
// なので、アニメーション無しの1回限りの描画は、setTimeout か、画像の最終イベント内で実行します
//animate();
function init() {
camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 );
camera.position.z = 450;
scene = new THREE.Scene();
birds = [];
boids = [];
// 背景画像・人物画像用ラッパー
var parent = new THREE.Object3D();
// *************************************************
// 背景画像の読み込み
// *************************************************
var image = new Image()
image.onload = function () {
var texture = new THREE.Texture( this );
texture.needsUpdate = true;
var material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});
// 平面
var mesh = new THREE.Mesh(new THREE.PlaneGeometry(1200, 1200, 1, 1), material);
// 画面奥
mesh.position.z = -400;
// 大きさ調整
mesh.scale.x = 1.5;
mesh.scale.y = 1.5;
// 回転
mesh.rotation.x = 0;
mesh.rotation.y = 0;
// ラッパーに平面追加
parent.add( mesh );
// *************************************************
// 人物画像の読み込み
// *************************************************
var image = new Image()
image.onload = function () {
var texture = new THREE.Texture( this );
texture.needsUpdate = true;
var material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});
// 平面
var mesh = new THREE.Mesh(new THREE.PlaneGeometry(778, 623, 1, 1), material);
// 画面前
mesh.position.z = 300;
// 表示位置調整
mesh.position.x = 80;
mesh.position.y = -42;
// 大きさ調整
mesh.scale.x = 0.3;
mesh.scale.y = 0.3;
// 回転
mesh.rotation.x = 0;
mesh.rotation.y = 0;
// ラッパーに平面追加
parent.add( mesh );
// シーンにラッパー(画像2枚)追加
scene.add(parent);
// *************************************************
// 飛翔画像の読み込み
// *************************************************
var image = new Image()
image.onload = function () {
texture = new THREE.Texture( this );
texture.needsUpdate = true;
material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});
material.side = 2
// 200の飛翔物体
for ( var i = 0; i < 200; i ++ ) {
boid = boids[ i ] = new Boid();
boid.position.x = Math.random() * 400 - 200;
boid.position.y = Math.random() * 400 - 200;
boid.position.z = Math.random() * 400 - 200;
boid.velocity.x = Math.random() * 2 - 1;
boid.velocity.y = Math.random() * 2 - 1;
boid.velocity.z = Math.random() * 2 - 1;
boid.setAvoidWalls( true );
boid.setWorldSize( 500, 500, 400 );
// 飛翔画像を貼り付けたマテリアルを平面に適用
birds[ i ] = new THREE.Mesh( new THREE.PlaneGeometry(30, 30, 2, 1), material );
// オリジナルの特殊処理
bird = birds[ i ]
bird.phase = Math.floor( Math.random() * 62.83 );
// 飛翔物体単位でシーンに追加
scene.add( bird );
}
// 初回表示
render();
};
// 飛翔画像
image.src = "002.png";
};
// 人物画像
image.src = "girl.png";
}
// 背景画像
image.src = "moon.jpg";
renderer = new THREE.CanvasRenderer();
renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
document.addEventListener( 'mousemove', onDocumentMouseMove, false );
document.body.appendChild( renderer.domElement );
window.addEventListener( 'resize', onWindowResize, false );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth * 0.98, window.innerHeight * 0.98 );
render();
}
// マウスによる、飛翔物体の反応処理
function onDocumentMouseMove( event ) {
var vector = new THREE.Vector3( event.clientX - SCREEN_WIDTH_HALF, - event.clientY + SCREEN_HEIGHT_HALF, 0 );
for ( var i = 0, il = boids.length; i < il; i++ ) {
boid = boids[ i ];
vector.z = boid.position.z;
boid.repulse( vector );
}
}
// Three.js のお決まりの処理
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
// 飛翔物体の処理
for ( var i = 0, il = birds.length; i < il; i++ ) {
boid = boids[ i ];
boid.run( boids );
bird = birds[ i ];
// 旧版では無かった処理
bird.position.copy( boids[ i ].position );
// 飛翔物体の飛翔用の傾け処理
bird.rotation.y = Math.atan2( - boid.velocity.z, boid.velocity.x );
bird.rotation.z = Math.asin( boid.velocity.y / boid.velocity.length() );
// 画像を x 軸で90度回転して、横に寝かせる
bird.rotation.x = (180 * Math.PI / 180)/2;
// オリジナルの特殊処理
bird.phase = ( bird.phase + ( Math.max( 0, bird.rotation.z ) + 0.1 ) ) % 62.83;
// 平面画像のはばたき処理
bird.geometry.vertices[ 0 ].z = Math.sin( bird.phase ) * 15;
bird.geometry.vertices[ 2 ].z = Math.sin( bird.phase ) * 15;
// 0 1 2
// 3 4 5
// セグメントが 2x1 なので、0番と 2番を動かすと、羽の先が動きます。
// 羽全体を動かすのであれば、3番と5番も同時に値を変更してもいいです
}
renderer.render( scene, camera );
}