three.js实现下雨、下雪天气模拟

这篇具有很好参考价值的文章主要介绍了three.js实现下雨、下雪天气模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

three.js实现下雨、下雪天气模拟,javascript,数码相机,开发语言

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实现下雨效果:

three.js实现下雨、下雪天气模拟,javascript,数码相机,开发语言three.js实现下雨、下雪天气模拟,javascript,数码相机,开发语言雨滴和雪花图片

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; // x
         positions[i * 3 + 1] = Math.random() * 5000; // y
         positions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z
         //雨滴位移速度
         velocities[i * 3] = 0; // x
         velocities[i * 3 + 1] = -this.raindropSpeed; // y
         velocities[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; // x
            positions[i * 3 + 1] = Math.random() * 5000; // y
            positions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z

            // 修改雪花坠落位置数据,使其x、z方向上可以晃动飘落;修改dropSpeed坠落速度,雪花的速度会慢一些
            velocities[i * 3] = (Math.random() - 0.5) / 3*this.dropSpeed; // x
            velocities[i * 3 + 1] = -this.dropSpeed+ (Math.random() / 5*this.dropSpeed); // y
            velocities[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; // x
                positions[i * 3 + 1] = Math.random() * 5000; // y
                positions[i * 3 + 2] = (Math.random() - 0.5) * 16000; // z
            }
        }
        this.geom.attributes.position.needsUpdate = true
        this.group.position.copy( this.camera.position ); //不管放大还是缩小 雨滴不会改变
    }

 this.group.position.copy( this.camera.position ); 这句话很重要,将效果模型放在摄像机前面,避免出现放大缩小场景时天气效果无法覆盖整个场景的情况文章来源地址https://www.toymoban.com/news/detail-644873.html

到了这里,关于three.js实现下雨、下雪天气模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Three.js--》实现3d字体模型展示

    目录 项目搭建 初始化three.js基础代码 设置环境纹理 加载字体模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写three项目,借用vite构建工具搭建vue项

    2024年02月07日
    浏览(71)
  • Three.js--》实现3d地球模型展示

    目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借

    2024年02月08日
    浏览(64)
  • Three.js--》实现3d小岛模型搭建

    目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写three项目,借用vite构建

    2024年02月05日
    浏览(87)
  • Three Js实现颜色自定义变换

    Three js的官方文档教程中给予了很多的Geomerty来构造不同类别的三维多边形,例如立方体BoxGeometry、圆柱体CylinderGeometry、球体SphereGeometry等Three.js几何体类都是基于基类BufferGeometry二次封装。Geometry对原生WebGL中的顶点位置position、顶点法向量normal、顶点颜色color、顶点纹理坐标

    2024年02月10日
    浏览(41)
  • three.js实现点击事件(vue)

    1.加载模型(通过点击模型触发事件) 2.通过射线获取到事件源 (new THREE.Raycaster()和new THREE.Vector2()) 3.通过点击到该模型使用名字匹配 clickedObject.name==“xx” addEventListener监听事件触发 创建 Raycaster和Vector2 计算鼠标或触摸点的位置 (这里的event是通过事件监听获取) 更新射线

    2024年02月16日
    浏览(49)
  • THREE.JS实现个人简历网站

    最近,在github上面找到了一个不错的技术介绍网站,主要使用 html+css+js 原生三件套写的。我在此基础之上利用three.js加了一点3D元素在里面,让这个网站看起来更炫酷。 改的时候,感觉原生还是比不上框架来的方便,后续有时间我会抽离一个 vue组件 的版本。 在线访问 :个人

    2024年02月01日
    浏览(43)
  • three.js实现VR看房自由

           在很多看房软件,例如贝壳看房、VR博物馆或者VR展厅等等,为了更加真实的展示产品或者场景的特色,通常会通过一些VR或者全景图的方式,给用户带来沉浸式的体验,给视觉上带来比较震撼的效果,再加上一些动感的音乐,仿佛让人深陷其中,无法自拔。假的,因

    2024年01月18日
    浏览(40)
  • Three.js--》实现3D汽车展厅效果展示

    目录 项目搭建 初始化three.js基础代码 加载汽车模型 设置展厅效果 设置GUI面板动态控制车身操作 车门操作与车身视角展示 设置手动点击打开关闭车门 设置图片背景 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起

    2024年02月09日
    浏览(54)
  • three.js实现3D室内全景看房

    首先我们先搭建一个项目,我选择使用vite来进行项目的搭建,执行命令如下: 这样一个基本的项目就搭建成功了,目录如下所示 然后,下载一下three.js工具,执行如下命令 页面中引入 先搭建一个立体图形,并画出辅助线,如下所示  实现代码如下: 接着,给我们的立体图

    2024年02月12日
    浏览(47)
  • Three.js--》实现3d地月模型展示

    目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写three项目,借用vite构建

    2024年02月07日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包