three.js
アニメーションのレンダリングループ:オブジェクトの動的更新
サーチ…
前書き
このドキュメントでは、Three.jsシーンに直接アニメーションを追加する一般的な方法について説明します。シーンにダイナミックな動き(トゥイーン、フィジックスなど)を追加できるライブラリやフレームワークはありますが、数行のコードで簡単にこれを行う方法を理解すると役に立ちます。
備考
アニメーションのコアコンセプトは、オブジェクトのプロパティ(通常は回転と平行移動)を一定期間にわたって少量で更新することです。たとえば、X位置を0.1秒ごとに1秒ずつ増加させてオブジェクトを平行移動させると、X軸の1秒後に1単位増加しますが、ビューアはその位置にスムーズに移動したと認識します新しい位置に直接ジャンプするのではなく、
私たちを助けるために、スクリプトでレンダリングループを作成します 。
var render = function () {
requestAnimationFrame( render );
//update some properties here
renderer.render(scene, camera);
}
上のスピンキューブの例では、新しいアニメーションフレームが要求されるたびにキューブの回転を変更するために、小さなインクリメンタルアップデートというこのアイデアを使用します。インクリメントすることによりrotation.x
とrotation.y
のプロパティcube
すべてのフレーム上のオブジェクトを、キューブは、これら二つの軸上で回転するように見えます。
別の例として、必要な更新を他の関数に分けることは珍しいことではありません。追加の計算とチェックを行いながらレンダリングループを整理しておくことができます。たとえば、以下のレンダリングループでは、シーン内の別のオブジェクト( updatePoints()
場合はオブジェクトの配列)を更新する4つの異なる更新関数を呼び出します。
//render loop
function render() {
requestAnimationFrame( render );
updateGrid();
updateCube();
updateCamera();
updatePoints(pList);
renderer.render( scene, camera);
}
render();
オンラインの例では、カメラコントロールもレンダリングループの一部であることがわかります。
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.enableZoom = true;
controls.autoRotate = true;
var render = function () {
requestAnimationFrame( render );
controls.update();
renderer.render(scene, camera);
};
これは、カメラを制御するためのスクリプトが同じことをしているからです。それを時間とともに更新する。変更は、マウスの位置などのユーザー入力や、パスをたどるようなプログラマチックなものによって引き起こされる可能性があります。どちらの場合も、カメラをアニメーション化するだけです。
スピニングキューブ
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
//Create an render loop to allow animation
var render = function () {
requestAnimationFrame( render );
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
};
render();
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow