threejs Point

利用point实现雪花下落的效果

const amount=500;
const radius=150;
const position = new Float32Array(amount * 3);//生成的数据长度为amount * 3,每一个数据元素 均为0
const colors = new Float32Array(amount * 3);
const sizes = new Float32Array(amount);

const vertex = new THREE.Vector3();
function addSnow1(){
  for(let i=0 ;i<amount;i++){
    vertex.x=(Math.random()*2-1)*radius;
    vertex.y=(Math.random()*2-1)*radius;
    vertex.z=(Math.random()*2-1)*radius;

    vertex.toArray(position,i*3);//将vertex赋值给positions(索引从i*3开始)
  }
  
  const geometry = new THREE.BufferGeometry();
  //可用于顶点着色器
  geometry.setAttribute('position',new THREE.BufferAttribute(position,3));
  geometry.setAttribute( 'customColor', new THREE.BufferAttribute( colors, 3 ) );
  geometry.setAttribute('size',new THREE.BufferAttribute(sizes,1));

  let textureLoader=new THREE.TextureLoader();
  textureLoader.load('./textures/snowflake2.png',function(texture){
    
    const material = new THREE.PointsMaterial( {
      side: THREE.DoubleSide ,
      map:texture,
      blending: THREE.AdditiveBlending,
      depthTest: false,//关闭深度检测 避免前面雪花的透明边框遮挡后面雪花
      size :10,
    } );
    sphere = new THREE.Points( geometry, material );
    scene.add( sphere );
  });
}

在render()中

if(sphere){
    const attributes = sphere.geometry.attributes;
    for(let i=0;i<attributes.position.array.length;i=i+3){
      if(attributes.position.array[i+1]>-radius){
        attributes.position.array[i+1]-=0.2;
      }else{
        attributes.position.array[i+1]=radius;
      }
      
    }
    attributes.position.needsUpdate = true;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值