今回は表示した物体をアニメーションさせてみる。
まずは簡単なところで、rotationをフレームごとに変えることで、物体をぐるぐる回してみる。
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <script src="three.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script> var APP = { }; APP.animate = function() { APP.cube.rotation.x = APP.cube.rotation.x + 0.01; APP.cube.rotation.y = APP.cube.rotation.y + 0.01; APP.renderer.render(APP.scene, APP.camera); window.requestAnimationFrame( APP.animate ); } $(document).ready( function() { // Rendererを用意 APP.renderer = new THREE.WebGLRenderer( { 'canvas' : $('#canvas')[0] } ); APP.renderer.setSize(300, 300); // Cameraを用意 APP.camera = new THREE.PerspectiveCamera(); APP.camera.position.z = 500; // Sceneを用意 APP.scene = new THREE.Scene(); APP.scene.add( APP.camera ); // 球を作る var sphere = new THREE.CubeGeometry(100, 100, 100); var material = new THREE.MeshLambertMaterial( { color: 0x33ccff } ) APP.cube = new THREE.Mesh( sphere, material ); APP.scene.add( APP.cube ); // 光 var light = new THREE.SpotLight(0xffffff); light.position.set( 0, 500, 500 ); APP.scene.add( light ); APP.animate(); } ); </script> </head> <body> <canvas id="canvas" style="border:solid 1px; margin: 30px;"> 青春キャンパス </canvas> </body> </html>
青いCubeを書いて、そこにSpotLightを当ててます。あとはanimate関数でフレームごとにrotationを変動させる処理を書いています。
このソースの動作は下記リンク参照。
X軸のpositionを変更することで、左右に動かしてみる。
APP.moveX = 2; APP. animate = function() { // 150で方向転換 if( Math.abs( APP.cube.position.x ) > 150 ) APP.moveX *= -1; // X軸に移動 APP.cube.position.x += APP.moveX; // なんとなく回転もさせておく APP.cube.rotation.x += 0.01; APP.cube.rotation.y += 0.01; APP.renderer.render(APP.scene, APP.camera); window.requestAnimationFrame( APP.animate ); }
position.xを適当に増減させてるだけですね。これを実行すると、下記リンクのような動きになります。
上の例ではX軸しか動かしてなかったので、Y軸も動かしてみる。
APP.moveX = 2; APP.moveY = 2; APP. animate = function() { // 150で方向転換(角度は少しランダム・徐々にスピードアップ) if( Math.abs( APP.cube.position.x ) > 150 ) { APP.moveX = Math.abs( APP.moveX ) + (Math.random() / 5 - 0.05); if( APP.cube.position.x > 150 ) APP.moveX *= -1; } if( Math.abs( APP.cube.position.y ) > 150 ) { APP.moveY = Math.abs( APP.moveY ) + (Math.random() / 5 - 0.05); if( APP.cube.position.y > 150 ) APP.moveY *= -1; } // 移動 APP.cube.position.x += APP.moveX; APP.cube.position.y += APP.moveY; // なんとなく回転もさせておく APP.cube.rotation.x += 0.01; APP.cube.rotation.y += 0.01; APP.renderer.render(APP.scene, APP.camera); window.requestAnimationFrame( APP.animate ); }
同じ方向に跳ね返ってもつまらないので、速度にランダム要素を加えている。ランダムの期待値が若干プラスになるようにしているので、徐々にスピードアップします。放っておくとものすごいスピードで動きます。-0.05のところを-0.1にすれば、だいたい同じような速度で動くはず。
物体ではなくカメラを動かしてみる。まずは簡単に、徐々にカメラが近づけてみる。
var APP = { }; APP. animate = function() { if( APP.camera.position.z < 0 ) APP.camera.position.z = 500; APP.camera.position.z -= 1; APP.renderer.render(APP.scene, APP.camera); window.requestAnimationFrame( APP.animate ); } $(document).ready( function() { // Rendererを用意 APP.renderer = new THREE.WebGLRenderer( { 'canvas' : $('#canvas')[0] } ); APP.renderer.setSize(300, 300); // Cameraを用意 APP.camera = new THREE.PerspectiveCamera(); APP.camera.position.z = 500; // Sceneを用意 APP.scene = new THREE.Scene(); APP.scene.add( APP.camera ); // 球を作る for( var i = 0; i < 100; i++ ) { var geometry = new THREE.SphereGeometry(10); var material = new THREE.MeshLambertMaterial( { color: 0xffffff } ) var mesh = new THREE.Mesh( geometry, material ); mesh.position.set( Math.random()*500-250, Math.random()*500-250, Math.random()*500-250 ); APP.scene.add( mesh ); } // 光 var light = new THREE.SpotLight(0xffffff); light.position.set( 0, 500, 500 ); APP.scene.add( light ); APP.animate(); } );
カメラのpositionを1ずつ近づけている。
examples/animation_camera1.html
ただ近づけるだけでは面白みがないので、周囲を回してみる。
APP.pos = 0; APP. animate = function() { APP.pos += 0.01; APP.camera.position.x = Math.cos( APP.pos ) * 500; APP.camera.position.z = Math.sin( APP.pos ) * 500; APP.camera.lookAt(new THREE.Vector3(0,0,0)); APP.renderer.render(APP.scene, APP.camera); window.requestAnimationFrame( APP.animate ); }
カメラのポジションを500の距離で円運動させつつ、視点の向き先を0,0,0のポジションに合わせている。
マウスのドラッグやホイールでカメラを動かすこともできる。自前でやるのは面倒なので、three.jsのExamplesに用意されているcontrolsの子を使う。
下記はTrackballControls.jsを使った場合の例。
<script src="three.js"></script> <script src="TrackballControls.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script> var APP = { }; APP.animate = function() { APP.renderer.render( APP.scene, APP.camera ); APP.controls.update(); requestAnimationFrame( APP.animate ); }; $(document).ready( function() { // Rendererを用意 APP.renderer = new THREE.WebGLRenderer( { 'canvas' : $('#canvas')[0] } ); APP.renderer.setSize(300, 300); // Cameraを用意 APP.camera = new THREE.PerspectiveCamera(); APP.camera.position.z = 500; // Sceneを用意 APP.scene = new THREE.Scene(); APP.scene.add( APP.camera ); // 球を作る for( var i = 0; i < 100; i++ ) { var geometry = new THREE.SphereGeometry(10); var material = new THREE.MeshLambertMaterial( { color: 0xaaffff } ) var mesh = new THREE.Mesh( geometry, material ); mesh.position.set( Math.random()*500-250, Math.random()*500-250, Math.random()*500-250 ); APP.scene.add( mesh ); } // 光源を用意 var light = new THREE.DirectionalLight(0xffffff); light.position.set(1, 1, 1).normalize(); APP.scene.add( light ); // Controlsを用意 APP.controls = new THREE.TrackballControls( APP.camera ); APP.animate(); } ); </script>
animate functionのところで、controlsをupdateする記述を入れています。これで定義しておいたTrackballControlsを利用することができます。実際の動きは下記リンク参照。マウスのドラッグで回転、ホイールでズームします。