0

我使用 THREE.Particle() 创建了很多粒子。我的粒子是星星。

我只希望其中一个稍微动画,就像星星一样。

我正在尝试做:

var oneParticle = scene.children[ Math.floor(Math.random() * (500 + 1))]; oneParticle.material.map = generateSprite();

generateSprite() 是一个返回有效画布的函数。

问题是 generateSprite() 被应用于每个粒子,而不是唯一的一个。

我意识到我必须使用另一种材料来实现它,但这意味着我应该为每个动画明星创建一个材料,这并不酷。

我是 three.js 的新手,我假设必须有一种简单、友好的方法来用动画只改变一个粒子的纹理,但不明白怎么做。

4

2 回答 2

0

也许您可以为一颗独特的恒星使用另一种粒子系统(因此,另一种材料)。我不认为你可以有多个。这样,其他粒子仍然可以有效地渲染。

于 2013-01-30T12:47:00.817 回答
0

我已经意识到如何自己解决我的问题。需要时会留在这里。

首先,我正在为粒子“运行时”创建材料:

while(particleCount--) {
    var material = new THREE.ParticleBasicMaterial({ 
        map: new THREE.Texture( generateSprite() ), 
    });

    var particle = new THREE.Particle( material );
}

generateSprite() 给我一个画布。是的,我知道它会降低性能,但在我的情况下,我有 500 个粒子。这不是太多,我想。

我写了一个函数,它抓取随机粒子并改变它的上下文:

function transformParticle() {
    var oneParticle = scene.children[ Math.floor(Math.random() * (500 + 1))];
    var ctx = oneParticle.material.map.image.getContext('2d');

    // ctx change code here
};

然后我只是在 requestAnimationFrame 中调用这个函数,它就可以工作了——只改变一个粒子的纹理而不创建独特的材料等。

而且我认为,使用 .getChildByName 可能是一个更好的主意,但找不到任何证据。

于 2013-01-31T07:56:48.857 回答