Three.js开发中遇到的常见问题总结和性能优化

关于Three.js开发中遇到的一些问题总结

1.加载外部模型文件无法在场景中显示:

(1) 确保当前文件内容是否能被读取,在Javascript的console中查找错误,并确定当你调用.load()的时候,使用了onError回调函数来输出结果, 如果err 输出则表示当前glb 文件内容无法被读取从新换一个glb文件尝试

	const loader = new GLTFLoader()loader.load('/three/1.glb', (result) => {console.log(result)}, () => {}, (err) => {console.log(err)})

(2) 尝试将模型放大缩小到原来的1000倍。许多模型的缩放比例各不相同,如果摄像机位于模型内,则大型模型将可能不会显示。或者可以在模型加载完成之后根据模型比例大小设置合适的缩放值

		//设置模型位置this.model.updateMatrixWorld()const box = new THREE.Box3().setFromObject(this.model);const size = box.getSize(new THREE.Vector3());const center = box.getCenter(new THREE.Vector3());// 计算缩放比例const maxSize = Math.max(size.x, size.y, size.z);const targetSize = 2.5; // 目标大小const scale = targetSize / (maxSize > 1 ? maxSize : .5);this.model.scale.set(scale, scale, scale)// 设置控制器最小缩放值this.controls.maxDistance = size.length() * 10// 设置相机位置this.camera.position.set(0, 2, 6)// 设置相机坐标系this.camera.lookAt(center)this.camera.updateProjectionMatrix();

(3)增加相机远端面的值 far,如果在创建相机时摄像机视锥体远端面的值设置过小也无法蒋模型正确的显示出来

this.camera = new THREE.PerspectiveCamera(45, clientWidth / clientHeight, 0.25, 100)
this.camera.far = 2000
this.camera.updateProjectionMatrix()

(4) 尝试添加一个光源并改变其位置。模型或许被隐藏在黑暗中。

       // 创建一个平行光this.directionalLight = new THREE.DirectionalLight('#1E90FF', 1)this.directionalLight.position.set(-1.44, 2.2, 1)this.directionalLight.castShadow = truethis.scene.add(this.directionalLight)

2.模型材质辉光效果影响背景图的正常显示

(1)在场景动画帧渲染中对背景图进行单独处理

	sceneAnimation() {this.renderAnimation = requestAnimationFrame(() => this.sceneAnimation())// 将不需要处理辉光的材质进行存储备份this.scene.traverse((v) => {if (v instanceof THREE.Scene) {this.materials.scene = v.backgroundv.background = null}if (!this.glowMaterialList.includes(v.name) && v.isMesh) {this.materials[v.uuid] = v.materialv.material = new THREE.MeshBasicMaterial({ color: 'black' })}})this.glowComposer.render()// 在辉光渲染器执行完之后在恢复材质原效果this.scene.traverse((v) => {if (this.materials[v.uuid]) {v.material = this.materials[v.uuid]delete this.materials[v.uuid]}if (v instanceof THREE.Scene) {v.background = this.materials.scenedelete this.materials.scene}})this.effectComposer.render()}

3.窗口大小改变场景画面像素变得模糊

在窗口监听方法中更新相机,渲染器等相关信息

	window.addEventListener("resize", this.onWindowResize.bind(this))// 监听窗口变化onWindowResize() {const { clientHeight, clientWidth } = this.container//调整屏幕大小this.camera.aspect = clientWidth / clientHeight //摄像机宽高比例this.camera.updateProjectionMatrix() //相机更新矩阵,将3d内容投射到2d面上转换this.renderer.setSize(clientWidth, clientHeight)this.effectComposer.setSize(clientWidth, clientHeight)this.glowComposer.setSize(clientWidth, clientHeight)}

4.修改材质的position(x,y,z)没有实际的效果

模型材质类型为 Mesh 的材质支持修改 position

	const mesh = this.model.getObjectByName(name)if(mesh.type == 'Mesh){mesh.position.set(1,10,1)}

5.材质设置网格,透明度和颜色没有实际效果或者造成材质显示不正确?

three.js支持 修改网格,透明渡和颜色的材质有:
MeshBasicMaterial,MeshLambertMaterial,MeshPhongMaterial,MeshStandardMaterial,MeshPhysicalMaterial,MeshToonMaterial 这六种

6.鼠标(点击,拖拽,缩放,移动)等操作不影响场景内容

// 启用或禁用摄像机平移,默认为true。
this.controls.enablePan = false
// 当设置为false时,控制器将不会响应用户的操作。默认值为true。
thsi.controls.enabled =false
// 启用或禁用摄像机水平或垂直旋转。默认值为true。
thsi.controls.enableRotate  =false
// 启用或禁用摄像机的缩放。
thsi.controls.enableZoom =false

7.将three.js color 值转化为普通 css 值

const colot = new THREE.Color(colorRGB).getStyle()

8.调整相机角度,模型的部分材质内容显示不完整或者不显示

将 frustumCulled值设置为false不管是否在相机视椎体都会渲染

   this.model.traverse(item => {if (item.isMesh && item.material) {item.frustumCulled = false  }})

关于Three.js开发中性能优化

在页面关闭销毁跳转离开时清除代码中 定时器事件监听动画帧等相关方法。释放场景中的材质内存,清除场景和模型相关信息

   // 清除模型数据onClearModelData(){cancelAnimationFrame(this.rotationAnimationFrame)cancelAnimationFrame(this.renderAnimation)cancelAnimationFrame(this.animationFrame)this.container.removeEventListener('click', this.onMouseClickModel)this.container.removeEventListener('mousedown', this.onMouseDownModel)this.container.removeEventListener('mousemove', this.onMouseMoveModel)window.removeEventListener("resize", this.onWindowResize)// 材质释放内存this.scene.traverse((v) => {if (v.type === 'Mesh') {v.geometry.dispose();v.material.dispose();}})// 清除场景和模型相关信息this.model.clear()this.scene.clear()}

完整的代码可参考:https://gitee.com/ZHANG_6666/Three.js3D基于three.js开发3d模型可视化编辑器

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/120385.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一加11/Ace2/10Pro手机如何实现全局120HZ高刷-游戏超级流畅效果

已经成功root啦。安卓13目前也一样支持LSPosed框架,如果你对LSP框架有需求,也可以使 自测120HZ刷新率诞生以后,很多小伙伴用上了就很难回来啦,一加11/Ace2/10Pro/9pro手 机厂商也对新机做了很多的适配,让我们日常使用起…

工业4G路由器的户外组网与无人值守场景应用

工业4G路由器是专为不便电缆布线的工业或日晒雨淋网络不畅的户外环境所设计的网络设备。它能够在没有光纤宽带的情况下使用插卡的方式提供4G或无线WiFi的网络支持。具备工业级防水功能,能够在户外环境下进行网络部署,并实现无人值守运行。工业4G路由器还…

SpringMVC使用

文章目录 一.MVC基础概念1.MVC定义2.SpringMVC和MVC的关系 二.SpringMVC的使用1.RequestMapping2.获取参数1.获取单个参数2.传递对象3.后端参数重命名(后端参数映射)4.获取URL中参数PathVariable5.上传文件RequestPart6.获取Cookie/Session/header 3.返回…

聚焦!智慧燃气使用体验到底怎么样?

文章来源:网络 关键词:智慧燃气、智能管网、智能气网、智慧燃气系统、智慧燃气平台 随着科技的发展,物联网技术不断进步,智能燃气也时常出现在我们的生活中。但大多数人仍然对智慧燃气知之甚少。究竟何为智慧燃气?能…

如何将Word转成PDF?试一下这个转换方法

Word转成PDF是现代办公中常见的需求,它可以确保文件的格式和内容在不同平台上保持一致,并且更加方便共享和打印。在这个数字化时代,我们经常需要将Word文档转换为PDF格式,无论是个人用户还是商务用户都会遇到这样的需求。那么如何…

IP地址、网关、网络/主机号、子网掩码关系

一、IP地址 IP地址组成 IP地址分为两个部分:网络号和主机号 (1)网络号:标识网段,保证相互连接的两个网段具有不同的标识。 (2)主机号:标识主机,同一网段内,主机之间具有相同的网…

介绍几个搜索引擎

Google:全球最大的搜索引擎,提供全面的搜索服务,包括网页、图片、视频、新闻、地图等。 Baidu:中国最大的搜索引擎,提供类似于Google的全面搜索服务,同时也有网盘、知道等功能。 Bing:微软公司…

一种编程语言,

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

初识Maven(一)命令行操作和idea创建maven工程

Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供**构建**和**依赖**管理支持的工具。 构建过程包含的主要的环节:- 清理:删除上一次构建的结果,为下一次构建做好准备 - 编译:Java 源程序编译成 *.class 字节码文件…

【AI】机器学习——绪论

文章目录 1.1 机器学习概念1.1.1 定义统计机器学习与数据挖掘区别机器学习前提 1.1.2 术语1.1.3 特点以数据为研究对象目标方法——基于数据构建模型SML三要素SML步骤 1.2 分类1.2.1 参数化/非参数化方法1.2.2 按算法分类1.2.3 按模型分类概率模型非概率模型逻辑斯蒂回归 1.2.4…

力扣刷题49 字母 异位词分组

目录 题目描述代码实现基本实现优化代码 基础知识回溯集合 参考 题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”…

桌面应用小程序,一种创新的跨端开发方案

Qt Group在提及2023年有桌面端应用程序开发热门趋势时,曾经提及三点: 关注用户体验:无论您是为桌面端、移动端,还是为两者一起开发应用程序,有一点是可以确定的:随着市场竞争日益激烈,对产品的期…

Vue框架--Vue中的属性监听

1.侦听属性概述 Vue提供了对属性变化的侦听操作,使用watch关键字实现。当被监视的属性变化时, 回调函数自动调用, 进行相关操作。这里需要注意的是你所侦听的属性必须存在。 2.代码实现 可以使用两种方式实现属性的侦听。 第一种:我们把侦听属性作为一个配置项目,放入Vue实…

ctfhub ssrf(3关)

文章目录 内网访问伪协议读取文件扫描端口 内网访问 根据该题目,是让我们访问127.0.0.1/falg.php,访问给出的链接后用bp抓包,修改URL,发送后得到flag: 伪协议读取文件 这题的让我们用伪协议,而网站的目录…

用WebGPU实现基于物理的渲染

推荐:用 NSDT编辑器 快速搭建可编程3D场景 最近,我花了相当多的时间在 WebGPU 中使用 IBL(基于图像的照明)编写 PBR(基于物理的渲染)渲染器。 PBR 本身并没有什么新奇之处。 这是一项自 2014 年以来就存在的…

GeoServe Web 管理界面 实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

tkinter控件样式

文章目录 以按钮为例共有参数动态属性 tkinter系列: GUI初步💎布局💎绑定变量💎绑定事件💎消息框💎文件对话框💎控件样式扫雷小游戏💎强行表白神器 以按钮为例 tkinter对控件的诸…

47、TCP的流量控制

从这一节开始,我们学习通信双方应用进程建立TCP连接之后,数据传输过程中,TCP有哪些机制保证传输可靠性的。本节先学习第一种机制:流量控制。 窗口与流量控制 首先,我们要知道的是:什么是流量控制&#xff…

【GPT引领前沿】GPT4技术与AI绘图

推荐阅读: 1、遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 2、GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术 GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。例如在科研编程…

Mybatis的关联关系配置一对一,一对多,多对多的映射关系

目录 关联关系映射 一对一关联: 一对多关联: 多对多关联: 导入数据库表 一对多 一对一 多对多 关联关系映射 关联关系映射在Mybatis中主要通过三种方式实现:一对一关联和一对多关联及多对多关联。 一对一关联:…