简体   繁体   English

Three.js动画曲线

[英]Three.js Animated curve

I try to animate a 2D curve in Three.js over time. 我尝试随着时间在Three.js中为2D曲线设置动画。 I'll need more than 4 control points, so I'm not using Bezier curves. 我需要4个以上的控制点,所以我不使用贝塞尔曲线。 I created a Three.Line based on a SplineCurve. 我基于SplineCurve创建了Three.Line。

If I log the geometry.vertices position of my line they'll change over time, but geometry.attributes.position remains the same. 如果我记录线的geometry.vertices位置,它们会随着时间而变化,但是geometry.attributes.position保持不变。 Is it possible to animate the line based on the curve animation ? 是否可以根据曲线动画对线进行动画处理? I managed to do this with Bezier Curves, but can't find a way with SplineCurve. 我设法用Bezier曲线做到了这一点,但是用SplineCurve找不到方法。 Thank you for your help, here's my code : 谢谢您的帮助,这是我的代码:

First I create the line : 首先,我创建一行:

var curve = new THREE.SplineCurve( [
                new THREE.Vector3( -10, 0, 10 ),
                new THREE.Vector3( -5, 5, 5 ),
                new THREE.Vector3( 0, 0, 0 ),
                new THREE.Vector3( 5, -5, 5 ),
                new THREE.Vector3( 10, 0, 10 )
            ] );

            var points = curve.getPoints( 50 );

            var geometry = new THREE.BufferGeometry().setFromPoints( points );

            var material = new THREE.LineBasicMaterial( { color : 0xff0000 } );

            // Create the final object to add to the scene
            curveObject = new THREE.Line( geometry, material );

            scene.add( curveObject );

            curveObject.curve = curve;

Then I try to update it : 然后我尝试更新它:

curveObject.curve.points[0].x += 1;

curveObject.geometry.vertices = curveObject.curve.getPoints( 50 );
curveObject.geometry.verticesNeedUpdate = true;
curveObject.geometry.attributes.needsUpdate = true;

You can do it like that: 您可以这样做:

 var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(60, 1, 1, 1000); camera.position.set(8, 13, 25); var renderer = new THREE.WebGLRenderer({ antialias: true }); var canvas = renderer.domElement; document.body.appendChild(canvas); var controls = new THREE.OrbitControls(camera, renderer.domElement); scene.add(new THREE.GridHelper(20, 40)); var curve = new THREE.CatmullRomCurve3([ new THREE.Vector3(-10, 0, 10), new THREE.Vector3(-5, 5, 5), new THREE.Vector3(0, 0, 0), new THREE.Vector3(5, -5, 5), new THREE.Vector3(10, 0, 10) ]); var points = curve.getPoints(50); var geometry = new THREE.BufferGeometry().setFromPoints(points); var material = new THREE.LineBasicMaterial({ color: 0x00ffff }); var curveObject = new THREE.Line(geometry, material); scene.add(curveObject); var clock = new THREE.Clock(); var time = 0; render(); function resize(renderer) { const canvas = renderer.domElement; const width = canvas.clientWidth; const height = canvas.clientHeight; const needResize = canvas.width !== width || canvas.height !== height; if (needResize) { renderer.setSize(width, height, false); } return needResize; } function render() { if (resize(renderer)) { camera.aspect = canvas.clientWidth / canvas.clientHeight; camera.updateProjectionMatrix(); } renderer.render(scene, camera); time += clock.getDelta(); curve.points[1].y = Math.sin(time) * 2.5; geometry = new THREE.BufferGeometry().setFromPoints(curve.getPoints(50)); curveObject.geometry.dispose(); curveObject.geometry = geometry; requestAnimationFrame(render); } 
 html, body { height: 100%; margin: 0; overflow: hidden; } canvas { width: 100%; height: 100%; display; block; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/97/three.min.js"></script> <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM