gpt4 book ai didi

javascript - Three.js:如何为粒子沿线设置动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:24:07 25 4
gpt4 key购买 nike

我正在尝试沿着类似于此 chrome 实验的路径设置粒子动画:http://armsglobe.chromeexperiments.com/

我已经尝试深入研究这个项目的源代码,到目前为止我摸索到的是他们使用内置曲线方法 .getPoitns() 在他们的线上生成大约 30 个点。

有没有更好的例子来说明我想要完成的事情?有没有比使用 .lerp() 方法 30 次获得 30 分的在线获得积分的方法?我应该只使用 TWEEN 动画吗?

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

最佳答案

我找到了一个解决方案,不确定它是否是最好的,但它运行良好。

您可以在 JsFiddle 上找到演示:https://jsfiddle.net/L4beLw26/

//First create the line that we want to animate the particles along
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(-800, 0, -800));
geometry.vertices.push(new THREE.Vector3(800, 0, 0));

var line = new THREE.Line(geometry, material);
var startPoint = line.geometry.vertices[0];
var endPoint = line.geometry.vertices[1];
scene.add(line);


//next create a set of about 30 animation points along the line
var animationPoints = createLinePoints(startPoint, endPoint);

//add particles to scene
for ( i = 0; i < numParticles; i ++ ) {
var desiredIndex = i / numParticles * animationPoints.length;
var rIndex = constrain(Math.floor(desiredIndex),0,animationPoints.length-1);
var particle = new THREE.Vector3();
var particle = animationPoints[rIndex].clone();
particle.moveIndex = rIndex;
particle.nextIndex = rIndex+1;
if(particle.nextIndex >= animationPoints.length )
particle.nextIndex = 0;
particle.lerpN = 0;
particle.path = animationPoints;
particleGeometry.vertices.push( particle );
}

//set particle material
var pMaterial = new THREE.ParticleBasicMaterial({
color: 0x00FF00,
size: 50,
map: THREE.ImageUtils.loadTexture(
"assets/textures/map_mask.png"
),
blending: THREE.AdditiveBlending,
transparent: true
});


var particles = new THREE.ParticleSystem( particleGeometry, pMaterial );
particles.sortParticles = true;
particles.dynamic = true;
scene.add(particles);


//update function for each particle animation
particles.update = function(){
// var time = Date.now()
for( var i in this.geometry.vertices ){
var particle = this.geometry.vertices[i];
var path = particle.path;
particle.lerpN += 0.05;
if(particle.lerpN > 1){
particle.lerpN = 0;
particle.moveIndex = particle.nextIndex;
particle.nextIndex++;
if( particle.nextIndex >= path.length ){
particle.moveIndex = 0;
particle.nextIndex = 1;
}
}

var currentPoint = path[particle.moveIndex];
var nextPoint = path[particle.nextIndex];


particle.copy( currentPoint );
particle.lerp( nextPoint, particle.lerpN );
}
this.geometry.verticesNeedUpdate = true;
};




function createLinePoints(startPoint, endPoint){
var numPoints = 30;
var returnPoints = [];
for(i=0; i <= numPoints; i ++){
var thisPoint = startPoint.clone().lerp(endPoint, i/numPoints);
returnPoints.push(thisPoint);
}
return returnPoints;
}

function constrain(v, min, max){
if( v < min )
v = min;
else
if( v > max )
v = max;
return v;
}

然后在动画循环中:

particles.update();

关于javascript - Three.js:如何为粒子沿线设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25898635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com