无法在three.js中更改一个粒子的材质贴图

时间:2013-01-30 09:23:53

标签: three.js

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

我只想让其中一个像星星那样略微动画。

我正在尝试:

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

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

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

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

我是three.js的新手,我认为必须有简单,善良的方式来改变一个粒子的动画纹理,但无法理解。

2 个答案:

答案 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可能是一个更好的主意,但找不到任何证据。