javascript - 在 Three.js 中对线条的绘制进行动画处理

标签 javascript animation three.js

我想使用 Three.js 在屏幕上绘制线条动画。在本例中,我要绘制的线是洛伦兹吸引子,使用 this YouTube tutorial作为指导。

我迄今为止创建的内容的片段可在以下位置找到:

// CONFIGURE SCENE
// ------------------------------------

// Create Scene - acts as container
var scene = new THREE.Scene();

// Create camera - (field of view, aspect ratio, near and far planes)
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );	

// Renderer - webgl
var renderer = new THREE.WebGLRenderer( { alpha: true,  antialias: true } );
renderer.setClearColor( 0x000000, 0 ); // set to show background of page

// Tell renderer to render to size of window
renderer.setSize( window.innerWidth, window.innerHeight );

// Add renderer to DOM
document.body.appendChild(renderer.domElement);
var controls = new THREE.OrbitControls(camera, renderer.domElement);

// ADD GEOMETRY
// ------------------------------------
var x = -12.1;
var y = -22;
var z = 0;

var a = 10; // sigma
var b = 28; // beta
var c = 8/3; // rho

var dt, dx, dy, dz;
var points = [];

// A mesh is made up of geometry and material
// Geometry is like a scaffold. Made up of x,y,z coordinates called vertices 
// Material is the fill (faces) of the geometry

// Create Material (MeshBasic is not influenced by light)
var material = new THREE.LineBasicMaterial({
    color: 0x0000ff
});

var geometry = new THREE.Geometry();

// Create mesh, passing in geometry and material
var line = new THREE.Line(geometry, material);

// Calculate the 50000 Lorenz attractor vertices
for (var i = 0; i < 50000; i++) {
	dt = 0.01;
    dx = (a * (y - x)) * dt;
    dy = (x * (b - z) - y) * dt;
    dz = (x * y - c * z) * dt;
    
    x = x + dx;
    y = y + dy;
    z = z + dz;

    geometry.vertices.push(new THREE.Vector3(x, y, z));
}

// Add line to scene
scene.add(line);

// Move the camera out, else our camera will be at 0,0,0 and the attractor won't be visible by default
camera.position.z = 80;

// RENDER LOOP
// ------------------------------------
function render() {

	/**
	// Does not work - experimenting with animating the drawing of the attractor
	// ------------------------------------
	// Calculate the Lorenz attractor vertices
	dt = 0.01;
	dx = (a * (y - x)) * dt;
	dy = (x * (b - z) - y) * dt;
	dz = (x * y - c * z) * dt;
			
	x = x + dx;
	y = y + dy;
	z = z + dz;

	var vect = new THREE.Vector3(x, y, z); // Create three.js vector
	geometry.vertices.push(vect); // Add vertice to geometry
	// ------------------------------------
	**/

	renderer.render(scene, camera); // Render scene and camera

	// Rotate the attractor
	line.rotation.x += 0.001;
	line.rotation.y += 0.001;

	requestAnimationFrame(render); // Call animation loop recursively 
}
render(); // Initial call to loop
body {
  margin: 0;
  overflow: hidden;
  background-color: #ccc;
}
  canvas {
    width: 100%;
    height: 100%;
}
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r79/three.js"></script>
  <script src="https://s3-eu-west-1.amazonaws.com/code-pen/OrbitControls.js"></script>

如您所见,在将洛伦兹吸引子添加到场景之前,我能够成功绘制洛伦兹吸引子。

但是,我无法通过将新顶点推到渲染循环内的几何体上来对吸引器的绘制进行动画处理。这样做会导致该线在屏幕上不可见。您可以在 JavaScript 从第 73 行开始的注释部分中看到我在哪里尝试过这种方法。

一些搜索提出了使用 Three.js 的 BufferGeometry 的想法类(class)。但是,我不清楚该类到底是做什么的,或者如何在这个实例中应用它。

如有任何指导,我们将不胜感激。

最佳答案

查看 this SO answer ,您可以将此答案与您的 jsbin 代码结合起来。您所要做的就是将全局变量与吸引子首字母缩写

var MAX_POINTS = 50000;

var x = -12.1;
var y = -22;
var z = 0;

var a = 10; // sigma
var b = 28; // beta
var c = 8/3; // rho

var dt, dx, dy, dz; 

并对 updatePositions() 函数进行一些小更改,了解如何设置添加线段的坐标

var index = 0;
...
dt = 0.01;
dx = (a * (y - x)) * dt;
dy = (x * (b - z) - y) * dt;
dz = (x * y - c * z) * dt;

x = x + dx;
y = y + dy;
z = z + dz;

jsfiddle示例

关于javascript - 在 Three.js 中对线条的绘制进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40630295/

相关文章:

javascript - 编译 React 失败

jQuery UI 的 addClass 动画不会对子元素进行动画更改

vector - 在 Three.js 中,如何翻译一个 Vector3?

javascript - Three.js计算几何人脸面积(Face3)

JavaScript:可以使用 "Object.prototype.toString.call(obj)"进行数据类型检测吗?

javascript - 尝试使用knockout js将不同数据绑定(bind)到同一div时显示重复记录

javascript - 填充矩形();即使 x 和 y 是动态的,也只生成一次

javascript - 在 JavaScript 中,如何为模态图库中的每个图像添加动画效果?

Android Cordova 应用程序上的 CSS 动画滞后

javascript - THREE.JS:在一组元素上激活拖动控件后如何禁用它们?