ThreeJSでベジェ曲線をアニメーション化したいと思います。開始点、終了点、および制御点が更新されます。最終的には、一度に多くのカーブをアニメーション化する必要があります。これを行う最も効率的な方法は何ですか?ThreeJSでベジェ曲線をアニメーション化する
以下のコードスニペットを実行すると、フレームがレンダリングされるたびにBezierオブジェクト、ジオメトリおよびラインが作成されていることがわかります。シーンから前の行を削除して、新しい行を追加します。より良い方法がありますか?おそらく、ジオメトリだけを更新して、線をもう一度追加しないでしょうか?各フレームごとに新しい行を作成する
var camera, scene, renderer, geometry, material, mesh;
init();
animate();
/**
Create the scene, camera, renderer
*/
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(50, window.innerWidth/window.innerHeight, 1, 10000);
camera.position.z = 500;
scene.add(camera);
addCurve();
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
}
/**
Add the initial bezier curve to the scene
*/
function addCurve() {
testPoint = 0;
curve = new THREE.CubicBezierCurve3(
new THREE.Vector3(testPoint, 0, 0),
new THREE.Vector3(-5, 150, 0),
new THREE.Vector3(20, 150, 0),
new THREE.Vector3(10, 0, 0)
);
curveGeometry = new THREE.Geometry();
curveGeometry.vertices = curve.getPoints(50);
curveMaterial = new THREE.LineBasicMaterial({ color : 0xff0000 });
curveLine = new THREE.Line(curveGeometry, curveMaterial);
scene.add(curveLine);
}
/**
On each frame render, remove the old line, create new curve, geometry and add the new line
*/
function updateCurve() {
testPoint ++;
scene.remove(curveLine);
curve = new THREE.CubicBezierCurve3(
new THREE.Vector3(testPoint, 0, 0),
new THREE.Vector3(-5, 150, 0),
new THREE.Vector3(20, 150, 0),
new THREE.Vector3(10, 0, 0)
);
curveGeometry = new THREE.Geometry();
curveGeometry.vertices = curve.getPoints(50);
curveLine = new THREE.Line(curveGeometry, curveMaterial);
scene.add(curveLine);
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
updateCurve();
renderer.render(scene, camera);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js"></script>
(1)コンソールにrenderer.info' '入力。ジオメトリを正しく処分しないでください。代わりに、1つの 'Line'を作成し、頂点を更新します。 http://stackoverflow.com/questions/31399856/drawing-a-line-with-three-js-dynamically/31411794#31411794を参照してください(2)タイトなループでは 'new'を避けてください。オブジェクトを作成して再利用する。 – WestLangley