Ich möchte eine Bezier-Kurve in ThreeJS animieren. Start, Ende und Kontrollpunkte werden aktualisiert. Schließlich muss ich viele Kurven gleichzeitig animieren. Was ist der effizienteste Weg, dies zu tun?Animieren einer Bezier-Kurve in ThreeJS
Wenn Sie das Code-Snippet unten ausführen, sehen Sie, dass ich jedes Mal, wenn der Frame gerendert wird, das Bezier-Objekt, die Geometrie und die Linie erstellen. Ich entferne die vorherige Zeile aus der Szene und füge dann die neue, aktualisierte Zeile hinzu. Gibt es einen besseren Weg? Vielleicht nur die Geometrie aktualisieren und die Zeile nicht erneut hinzufügen?
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) Geben Sie 'in die Konsole renderer.info'. Sie entledigen sich nicht Ihrer Geometrien. Erstellen Sie stattdessen eine "Linie" und aktualisieren Sie die Scheitelpunkte. Siehe http://stackoverflow.com/questions/31399856/drawing-a-line-with-three-js-dynamically/31411794#31411794 (2) Vermeiden Sie "neue" in engen Schleifen. Objekte erstellen und wiederverwenden. – WestLangley