我使用THREE.Particle()创建了很多粒子。我的粒子是星星。
我只想让其中一个像星星那样略微动画。
我正在尝试:
var oneParticle = scene.children[ Math.floor(Math.random() * (500 + 1))];
oneParticle.material.map = generateSprite();
generateSprite()是一个返回有效画布的函数。
问题是generateSprite()正在应用于每个粒子,而不是唯一的粒子。
我意识到我必须使用另一种材料来实现它,但这意味着我应该为每个动画明星制作一种材料并且它并不酷。
我是three.js的新手,我认为必须有简单,善良的方式来改变一个粒子的动画纹理,但无法理解。
答案 0 :(得分:0)
也许你可以使用另一个粒子系统(因此,另一种材料)用于一颗独特的恒星。我不认为你可以有多个。这样,其他粒子仍然可以有效地渲染。
答案 1 :(得分: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可能是一个更好的主意,但找不到任何证据。