卜若的代码笔记-webgl系列-第二十七章:熟练应用A-粒子

1 当你一步一步的看完博客之后,你将从一只脆弱的蚂蚁变成一只强壮的蚂蚁,这一章我们将会创建粒子,也就是俗称精灵的东西:

1.1 第一种写法,Three.js自带的,也就是不用shader的

直接代码咯:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="../../core/WebglManager.js"></script>
    <script src="../../core/three.js"></script>
    <script src="../../core/BasicElementCreater.js"></script>
</head>
<body>


<script>
    window.onload = function (ev) {
        createGLCanvas();

        //加载贴图
        var textureLoader = new THREE.TextureLoader();
        var sprite1 = textureLoader.load( 'textures/snowflake2.png' );

        //创建粒子管理器
        var sp  =createSprite(sprite1);

        function update(ev) {
            //转webgl坐标
            var mouse = screen2WebglCoordinate(ev,800,800);
            //转视口坐标
            var viewPort = screenConvertToWorld(mouse);

            //生成粒子
            for (var i = 0;i<30;i++)
            {
                sp.updateVerticesBuf(Vector3((Math.random()-0.5)*0.1+viewPort.x,(Math.random()-0.5)*0.1+viewPort.y,0),1024);

            }
            //更新位置

            sp.updateParticalWithRandom(0.1);

        }

        glCanvas.onmousemove = function(ev){

            update(ev);
        }

    }


</script>
</body>
</html>

核心的sp生成代码:

function createSprite(sprite) {


    var spMaster = {};


    var  materials =  new THREE.PointsMaterial( { size: 1, map: sprite, blending: THREE.AdditiveBlending, depthTest: false, transparent: true } );
    var geometry = new THREE.BufferGeometry();
    var particles = new THREE.Points( geometry, materials );
    //添加到场景里面
    addObject(particles);
    spMaster.material =materials;
    spMaster.geometry =geometry;
    spMaster.partical = particles;
    spMaster.verticalBuffer = [];
    spMaster.index = 0;

    spMaster.updateVectircesPos = function(value,i){

        spMaster[i] += value;

    }
    spMaster.updateParticalWithRandom = function(value){

        for(var i in spMaster.verticalBuffer){

            spMaster.verticalBuffer[i] += (Math.random() - 0.5)*value;
        }

    }

    spMaster.updateVertices = function () {

        var positionAttribute = new THREE.Float32BufferAttribute(spMaster.verticalBuffer, 3 );
        geometry.addAttribute( 'position', positionAttribute );
    }
    spMaster.updateVerticesBuf = function(vector3,len){

        spMaster.verticalBuffer[spMaster.index*3+0]=(vector3.x);
        spMaster.verticalBuffer[spMaster.index*3+1]=(vector3.y);
        spMaster.verticalBuffer[spMaster.index*3+2]=(vector3.z);
        spMaster.index++;
        if(spMaster.index>len)
        {
            spMaster.index = 0;
        }

        spMaster.updateVertices();


    }
    return spMaster;

}

2 来看一下效果撒~

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值