首页 > 其他分享 >three.js高性能渲染室外场景

three.js高性能渲染室外场景

时间:2024-06-06 16:25:47浏览次数:17  
标签:map three js 地形 碰撞检测 相机 室外

大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~

关键词:three.js、Web3D、WebGL、室外场景、Instanced Draw、大场景、LOD、Frustum Cull、优化、开源

image

代码:Github

相关文章:
three.js实现数字孪生3D仓库一期(开源)
three.js使用Instanced Draw+Frustum Cull+LOD来渲染大场景(开源)
基于three.js的Instanced Draw+LOD+Frustum Cull的改进实现

我正在承接Web3D数字孪生项目,具体介绍可看承接各种Web3D业务

加QQ群交流:106047770

目录

亮点

本文的亮点是基于Instanced Draw+LOD+Frustum Cull优化,能够高性能地渲染树、草等室外物体;并且实现了基本的地形

本文代码能在PC端、移动端流程运行

height map

基于height map实现地形,能根据x、z坐标从height map中插值,获得y坐标(地形高度)

color map

预读取color map,作为顶点颜色,代替多层纹理(为了性能考虑),可用来实现 道路 等效果

基础纹理

为了性能考虑,只加入一张纹理,以repeat的方式铺在地形上,使其与顶点颜色叠加

光照

地形使用MeshPhongMaterial材质,Phong光照

加入第三人称人物

加入第三人称人物,实现方式详见实现人物

相机与地形 碰撞检测

相机移动时,不应该插入到地形中

最开始我是根据height map更新相机的y坐标,具体参考地形碰撞

这样做的问题是如果地形过高,可能导致相机拉得太高了;而且会有相机抖动的问题

所以,我改为加入地形Collider(立方体),让相机与Collider进行碰撞处理,具体详见three.js实现相机碰撞,相机不穿墙壁、物体

本文只加入了一个Collider,并以绿色的立方体来显示(实际上应该不可见)

人物与地形 碰撞检测

跟相机一样,人物也与地形Collider进行碰撞检测

加入树

基于Instanced Draw+LOD+Frustum Cull来加入树

加入草

草直接使用billboard+Instanced Draw+Frustum Cull来渲染

人物与树 碰撞检测

使用八叉树保存树,使人物与八叉树进行碰撞检测

改进方向

下面是对地形的改进方向:

  • 超大地形
    目前地形只有一块,如果是开放世界的话,应该是多块地形;
    应该用四叉树作为加速结构来实现Frustum Cull;
    应该实现LOD(不同lod的三角面数不同,material也不同,如近的lod应该使用多层纹理+color map,远的lod只使用color map)
    参考:
    Tutorial 18: Large Terrain Rendering

  • 多层纹理

  • 加入normal map,显示细节

  • 加入水

地形的系列教程如下:

DirectX 11 Terrain Tutorials
DirectX 11 Terrain Tutorials - Series 2

参考资料

Use Tri-Planar Texture Mapping for Better Terrain

多层纹理(Multilayered Terrain)

标签:map,three,js,地形,碰撞检测,相机,室外
From: https://www.cnblogs.com/chaogex/p/18235482

相关文章

  • 锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞复现(XVE-2024-2116)
    0x01产品简介锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务,使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。0x02漏洞概述校园网自助服务系统/selfservice/selfservice/module/scgroup......
  • I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞复现(XVE-2024-2115)
    0x01产品简介iDocView是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。0x02漏洞概述iDocView是一个在线文档预览系统/view/qJvqhFt.json接口处存在任意文件读取漏洞,未授权的攻击者可以利用此接口并携带默认token读取服务器敏感文件信息,使系统处于极度不安全的......
  • JavaScript-JSON
    JavaScript-JSON1.自定义对象var对象名={属性名1:属性值1,属性名2:属性值2,属性名3:属性值3,函数名称:function(形参列表){}};语法调用属性和函数:对象名.属性名;对象名.函数名();2.json对象JSON对象:JavaScriptObjectNotation,JavaScript对......
  • js实现元素拖拽
    采用vueuse中的useDraggable,使用便捷,不需要过多复杂的操作实现流程在项目中安装vueusenpmi@vueuse/core然后在需要用到的页面引入useDraggableimport{useDraggable}from"@vueuse/core";使用通过调用useDraggable函数,将需要进行拖拽的元素dragref作为入参传入,同时......
  • Azure 函数(Node.js):如何从代码中读取上传到 Azure 证书刀片的公钥(.cer)?
    我在Node.js上运行了AzureFunctions。(另外,请注意,通过应用程序服务计划运行的底层操作系统是Windows)让我先绕道而行。一直以来,我都是从Node.js代码访问AzureKeyVault,因此我知道如何从Node.js代码访问KeyVault,这样看起来就像这样:co......
  • 004基于SSM+Jsp的高校四六级报名管理系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示前台首页登录界面个人中心报名界面学生管理报名管理报名记录准考记录身份认证考试资讯......
  • 003基于SSM+Jsp+Mysql的美好生活日志网
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示前台首页用户注册用户登录日记信息管理员登录用户管理日记信息管理美食信息管理景点信息管......
  • js 数组各种常见的操作
    JavaScript中的数组提供了多种操作方法,以下是一些常见的数组操作示例:1创建数组javascriptconstnumbers=[1,2,3,4,5];2访问数组元素javascriptconsole.log(numbers[0]);//输出:13修改数组元素javascriptnumbers[0]=10;4数组长度javascriptc......
  • js检测资源是否存在
    this.getPicture(()=>{console.log(‘成功’)},url);//获取图片getPicture(conBack,url){letthat=this;//使用示例this.checkResource(url).then(exists=>{if(exists){c......
  • js实现点击切换图片,常用于图片画廊、产品展示、选项卡切换等
            以下代码实现产品展示或图片画廊相关的功能。具体来说,它实现了一个带有导航和对应内容区域的产品展示页面。用户通过导航来浏览不同的产品/项目,并在内容区域中查看与每个产品/项目相关的详细信息(在这种情况下是两张图片)。导航与内容的联动:页面有一个导航区域(......