three.js进击版火焰动画

const texture = new THREE.TextureLoader().load('/public/fire.png');
const smokeTexture = new THREE.TextureLoader().load('/public/smoke.png');
const smokeMaterial = new THREE.SpriteMaterial({
    color: 0x000000,
    map: smokeTexture,
    transparent: true,
    opacity: 0.1,
});
let smokeGroup = new THREE.Group();

const spriteMaterial = new THREE.SpriteMaterial({
    map: texture,
    transparent: true,
    opacity: 0.3,
    blending: THREE.AddOperation
});
let fireGroup = new THREE.Group();
//添加火焰
function addFire() {
    for (let i = 0; i < 500; i++) {
        // 精灵模型共享材质
        const sprite = new THREE.Sprite(smokeMaterial);
        smokeGroup.add(sprite);
        sprite.scale.set(2, 2, 2);
        // 设置精灵模型位置,在长方体空间上上随机分布
        const x = 15 * (Math.random() - 0.5);
        const y = 3 * Math.random();
        const z = 8 * (Math.random() - 0.5);
        sprite.position.set(x, y, z)
    };
    for (let i = 0; i < 500; i++) {
        // 精灵模型共享材质
        const sprite = new THREE.Sprite(spriteMaterial);
        fireGroup.add(sprite);
        sprite.scale.set(2, 2, 2);
        // 设置精灵模型位置,在长方体空间上上随机分布
        const x = 15 * (Math.random() - 0.5);
        const y = 3 * Math.random();
        const z = 8 * (Math.random() - 0.5);
        sprite.position.set(x, y, z)
    };
    fireGroup.position.set(-8, 0, -6);
    smokeGroup.position.set(-8, 0, -6);

    innerModel.add(fireGroup, smokeGroup);
    function loop() {
        fireGroup.children.forEach(sprite => {
            // 火焰的y坐标每次
            sprite.position.y += 0.1;
            if (sprite.position.y > 3) {

                sprite.position.y = Math.random();
                // sprite.material.opacity = 1;
            }
        });
        smokeGroup.children.forEach(sprite => {
            // 火焰的y坐标每次
            sprite.position.y += 0.1;
            if (sprite.position.y > 6) {

                sprite.position.y = Math.random() + 3;
                
            }
        });
        requestAnimationFrame(loop);
    }
    loop();
}

原理很简单,跟之前做雨雪效果一样,只不过换成往上移动

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值