three.js版本:"three": "^0.136.0"

1.初始化场景、相机、渲染器

// 创建场景、相机、渲染器this.scene = new THREE.Scene();this.camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 10000);this.camera.position.set(1000,500, 5560);this.renderer = new THREE.WebGLRenderer({alpha: true,antialias: true,//是否执行抗锯齿。默认为false.});this.renderer.compile(scene, camera)this.renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( this.renderer.domElement );

2.使用控制器

import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js';this.controls = new OrbitControls(this.camera, renderer.domElement);

3.天气效果

3.1 下雨效果

要创建下雨效果,你可以使用Three.js的例子系统来模拟雨滴。你可以创建一个包含很多雨滴的粒子系统,并使其沿着场景的Z轴方向下落。下面是一个简单的例子,使用Three.js实现下雨效果:

雨滴和雪花图片

this.geom =null;
this.drops = 20000; //雨滴数量
this.raindropSpeed=5 //雨滴下落速度
this.group= new THREE.Group();
//
createRain(){//加载雨滴图片let rain = require('@/assets/2Dthumbnail/rain.png')const texture = new THREE.TextureLoader().load(rain)// 定义顶点数据const positions = new Float32Array(this.drops * 3);const velocities = new Float32Array(this.drops * 3);this.geom = new THREE.BufferGeometry()// 生成雨滴位置for(let i = 0; i < this.drops; i++){positions[i * 3] = (Math.random() - 0.5) * 16000; // xpositions[i * 3 + 1] = Math.random() * 5000; // ypositions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z//雨滴位移速度velocities[i * 3] = 0; // xvelocities[i * 3 + 1] = -this.raindropSpeed; // yvelocities[i * 3 + 2] = 0; // z}this.geom.setAttribute('position', new THREE.BufferAttribute(positions, 3));this.geom.setAttribute('velocity', new THREE.BufferAttribute(velocities, 3));
// 创建雨滴材质const rainMaterial = new THREE.PointsMaterial({//color: 0xffffff,size: 10,map: texture,transparent: true,blending: THREE.AdditiveBlending, // 融合模式depthTest: false, // 可以去掉texture的黑色背景});let Points = new THREE.Points(this.geom, rainMaterial)return  Points
}
this.group.name="下雨"
this.group.add(this.createRain())
this.scene.add(this.group) //添加到场景中

3.2 下雪效果

要模拟下雪,可以使用类似模拟下雨的方法,但需要将雨滴替换成雪花,并使它们在飘落时随机飘散,以模拟雪花的自然运动

createSnow(){...... //大部分代码与下雨效果都是一样的for(let i = 0; i < this.drops; i++){positions[i * 3] = (Math.random() - 0.5) * 16000; // xpositions[i * 3 + 1] = Math.random() * 5000; // ypositions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z// 修改雪花坠落位置数据,使其x、z方向上可以晃动飘落;修改dropSpeed坠落速度,雪花的速度会慢一些velocities[i * 3] = (Math.random() - 0.5) / 3*this.dropSpeed; // xvelocities[i * 3 + 1] = -this.dropSpeed+ (Math.random() / 5*this.dropSpeed); // yvelocities[i * 3 + 2] = (Math.random() - 0.5) / 3*this.dropSpeed; // z// 雪花的随机旋转角度snowflakeRotations[i * 3] = Math.random() * 2 * Math.PI;snowflakeRotations[i * 3 + 1] = Math.random() * 2 * Math.PI;snowflakeRotations[i * 3 + 2] = Math.random() * 2 * Math.PI;}this.geom.setAttribute('position', new THREE.BufferAttribute(positions, 3));this.geom.setAttribute('velocity', new THREE.BufferAttribute(velocities, 3));this.geom.setAttribute('rotation', new THREE.BufferAttribute(snowflakeRotations, 1     ));
}

4.更新帧动画

我们使用requestAnimationFrame函数来每秒更新画面,并使用renderer对象来渲染场景。

render() {requestAnimationFrame( this.render );this.updateDrops();this.renderer.render( this.scene, this.camera );
}
 updateDrops() {const positions = this.geom.attributes.position.array;const velocities = this.geom.attributes.velocity.array;for(let i=0; i<this.drops;i++){ //change Y// 更新雨滴位置positions[i * 3] += velocities[i * 3];positions[i * 3 + 1] += velocities[i * 3 + 1];positions[i * 3 + 2] += velocities[i * 3 + 2];// 如果雨滴落到了地面,重新回到顶部if (positions[i * 3 + 1] < -500) {positions[i * 3] = (Math.random() - 0.5) * 16000; // xpositions[i * 3 + 1] = Math.random() * 5000; // ypositions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z}}this.geom.attributes.position.needsUpdate = truethis.group.position.copy( this.camera.position ); //不管放大还是缩小 雨滴不会改变}

this.group.position.copy( this.camera.position ); 这句话很重要,将效果模型放在摄像机前面,避免出现放大缩小场景时天气效果无法覆盖整个场景的情况

three.js实现下雨、下雪天气模拟相关推荐

  1. canvas 让你呼风唤雨,下雨下雪效果

    前端如何呼风唤雨 Canvas 等于什么?   = html5 =js = 取代flash =  你可以即见即所得向别人装逼!没错 进入 canvas 的权力游戏吧! 起初我创造了canvas . 我 ...

  2. skycons.js 基于canvas的天气动态js插件

    skycons.js 基于canvas的天气动态js插件 skycons.js是一个开源的javascript天气动画图标渲染器.相当于gif动图一样. skycons CDN地址:https://w ...

  3. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  4. three.js精灵模型-下雨场景效果模拟

    详情进入:Three.js零基础入门教程(郭隆邦) 通过足够多的精灵模型构成一个粒子系统,然后每一个雨滴按照在一定空间内随机分布,每个精灵模型都使用一个背景透明的雨滴rain.png作为纹理贴图. 效 ...

  5. skycons.js 基于canvas的天气动态图标小插件

    skycons是什么 skycons.js是一个开源的javascript天气动画图标渲染器.(特点就是动态的图标,敲黑板) skycons CDN地址:https://www.bootcdn.cn/ ...

  6. cesium,实现下雨下雪效果切换

    honey们,一起来学习cesium天气效果吧^^ 本篇文章实现的是简单的HTML页面在线显示,用其他框架的改一下就可以啦 1.CDN引入 <script src='https://cdn.bo ...

  7. js画布实现下雪效果

    之前使用css实现了下雪效果,也对比了前端多种实现动画的方法(链接见文末) 下面使用js和canvas的方法配合requestAnimationFrame实现一个简单的下雪效果,代码十分精简. 代码 ...

  8. js拖动窗口 用层模拟可移动的小窗口

    用层模拟可移动的小窗口 <style type='text/css'> <!-- body a:visited a:hover a:link --> </style> ...

  9. 【2021-01-05】JS逆向之B站模拟登入(含极验点选)

    文章目录 前言 一.页面分析 1.1 模拟页面请求 二.参数破解 2.1 登入参数password解密 2.2 验证码参数w破解 三.实现模拟登入 四.总结 前言 这次算是我自己的一次小突破吧,毕竟之 ...

最新文章

  1. 硬核干货:一位码农的架构师封神之路!
  2. type=radio增加onclick没有效果_张启东:如何有效增强KTV音响效果的立体感?
  3. JVM_03 运行时数据区 [ 程序计数器+本地方法栈 ]
  4. ipython安装_IPython 它不香吗?
  5. IPv6时代已来:双十一中的IPv6大规模应用实践
  6. 【java笔记】File类(3):FileFilter文件过滤器原理和使用
  7. 关于逻辑或的一个小小应用注意点
  8. KITTI数据集下载以及处理
  9. Mac动态桌面壁纸Dynamic Wallpaper惊艳你的桌面
  10. Android摇一摇领红包
  11. 国王的烦恼 蓝桥杯(最小生成树 kru)
  12. 【侯捷】C++ STL
  13. 「环卫吸粪车」天河区抽化粪池抽泥浆抽污水来了,解决黑臭水体!
  14. 在船舶共轨实验平台上使用Mbed LPC1768
  15. python怎么弄成白色背景_python – 在matplotlib中为colorbar添加白色背景
  16. form表单字段默认值
  17. CSS复合选择器,挥泪整理面经
  18. 基于骨骼点特征的视频分割任务——花样滑冰视频的动作解析
  19. android cm12 截屏,CM系列ROM精简列表 可删软件服务汇总
  20. java ajax多文件上传插件_jQuery Upload File 多文件批量上传插件 - 资源

热门文章

  1. 拼图模板软件分享!这几个拼图模板软件得看看!​
  2. 【rmzt:进击的巨人三笠xp主题】
  3. mysql数据库-DDL语言
  4. 小孩鼻子出血七种原因(小孩流鼻血是什么原因儿童鼻出血怎么回事
  5. python request大批量发送请求调用接口时,报错:[WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
  6. 【网络】网络基础套接字编程详解
  7. 云开发校园微社区微信小程序源码/二手交易/兼职交友微信小程序开源源码
  8. 微信小程序--使用swiper实现滚动广告
  9. 使用Git命令-查看远程分支、本地分支、创建分支、删除分支的方法
  10. Redis实例绑定CPU物理核优化Redis性能