Three.js深度冲突(模型闪烁)与解决方案

news2025/2/28 20:13:39

Mesh面重合渲染测试 

下面代码创建两个重合的矩形平面Mesh,通过浏览器预览,当你旋转三维场景的时候,你会发现模型渲染的时候产生闪烁。

这种现象,主要是两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象,可以称为深度冲突Z-fighting

// 两个矩形平面Mesh重合,产生闪烁
// 闪烁原因:两个矩形面位置重合,GPU无法分清谁在前谁在后
const geometry = new THREE.PlaneGeometry(250, 250);
const material = new THREE.MeshLambertMaterial({
    color: 0x00ffff,
    side: THREE.DoubleSide,
});
const mesh = new THREE.Mesh(geometry, material);


const geometry2 = new THREE.PlaneGeometry(300, 300); 
const material2 = new THREE.MeshLambertMaterial({
    color: 0xff6666,
    side: THREE.DoubleSide,
});
const mesh2 = new THREE.Mesh(geometry2, material2);

look

两个矩形Mesh拉开距离

适当偏移,解决深度冲突,偏移尺寸相对模型尺寸比较小,视觉上两个平面近似还是重合效果。

mesh2.position.z = 1;

 

间隙很小,深度冲突

当两个面间隙很小,也可能出现深度冲突。从纯理论的角度,你能分清0和0.0000...0000001的大小,但是实际上,电脑GPU精度是有限的

// 当两个面间隙很小,也可能出现深度冲突。
mesh2.position.z = 0.0000000000000000000001;

 同样会有问题 

 

透视投影相机对距离影响(深度冲突)

  • 第1步:设置两个Mesh平面的距离相差0.1,没有深度冲突导致的模型闪烁问题
mesh2.position.z = 0;
mesh2.position.z = 0.1;
camera.position.set(292, 223, 185);
  • 第2步:改变相机.position属性,你会发现当相机距离三维模型较远的时候,两个面也可能出现深度冲突,当然也可以通过相机控件OrbitControls缩放功能,改变相机与模型的距离,进行观察。
camera.position.set(292*5, 223*5, 185*5)

看效果

透视投影相机的投影规律是远小近大,和人眼观察世界一样,模型距离相机越远,模型渲染的效果越小,两个mesh之间的间距同样也会变小。当两个Mesh和相机距离远到一定程度,两个模型的距离也会无限接近0。

webgl渲染器设置对数深度缓冲区

两个矩形平面距离比较近,相差0.1

mesh2.position.z = 0;
mesh2.position.z = 0.1;
camera.position.set(292*5, 223*5, 185*5);

当一个三维场景中有一些面距离比较近,有深度冲突,可以尝试设置webgl渲染器设置对数深度缓冲区logarithmicDepthBuffer: true来优化或解决。logarithmicDepthBuffer: true作用简单来说,就是两个面间距比较小的时候,让threejs更容易区分两个面,谁在前,谁在后。

// WebGL渲染器设置
const renderer = new THREE.WebGLRenderer({
    // 设置对数深度缓冲区,优化深度冲突问题
    logarithmicDepthBuffer: true
});

 有一点要注意,当两个面间隙过小,或者重合,你设置webgl渲染器对数深度缓冲区也是无效的。

mesh2.position.z = 0;
//当两个面重合,logarithmicDepthBuffer: true无效
mesh2.position.z = 0;
//当两个面间隙过小,logarithmicDepthBuffer: true无效
mesh2.position.z = 0.00001;
camera.position.set(292*5, 223*5, 185*5);

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Debug | Litemall项目上线

文章目录 1. litemall资源1.1 Litemall项目开源网址1.2 Litemall网盘地址 2. 项目上线2.1 项目框架2.2 项目配置2.3 依赖工具安装2.4 数据库导入2.5 启动小商城和管理后台的后台服务2.6 启动管理后台的前台服务 3项目展示: 1. litemall资源 1.1 Litemall项目开源网…

webpack 自定义loader

文章目录 项目目录搭建项目my-raw-loader参数schema-utils tpl-loader 项目目录 让我们实现一些简易的loader,从大量的简易loader的实现过程中学习编写如何 webpack loader ├── loaders # loader目录 ├── src …

数据库sql语句-----游标和存储过程

关键词: create procedure xxx()as.......go 查询: exec ... 从例子中感悟一下: create table cartoon( linenum int, name varchar(50) not null, line varchar(100) not null )insert into cartoon values(1,灰太…

基于SpringBoot+Vue+MybatisPlus的智慧校园系统

智慧校园系统 1. 项目简介2. 项目模块3. 技术栈4. 软件环境4.1 安装数据库4.2 安装数据库客户端Navicat工具4.4 安装IDEA4.4 安装Maven 5. 系统页面5.1 首页登录页5.2 系统功能模块5.3 Swagger2接口文档查阅5.4 运行截图 6. 源代码下载 1. 项目简介 智慧校园管理系统是一个基于…

从零开始Vue3+Element Plus后台管理系统(十三)——富文本编辑器、Markdown编辑器、代码编辑器

早就想着要放几个编辑器的Demo到项目中,这也是项目开始就立下的flag。 今天专门挑选了几款主流编辑器,包括绕不开的富文本编辑器,码农最爱的markdown编辑器,还有用途相对少的代码编辑器。 时间有限的情况下,仅引入4个…

去哪儿酒店数据下载

字段内容包含: id int(11) NOT NULL AUTO_INCREMENT, hotelid varchar(50) DEFAULT NULL, url varchar(200) DEFAULT NULL, hotelname2 varchar(100) DEFAULT NULL, name varchar(100) DEFAULT NULL, province varchar(50) DEFAULT NULL, d…

zabbix安装完成后,无法找到zabbix/bin目录

问题 zabbix安装完成后,无法找到zabbix/bin目录 详细问题 笔者安装zabbix后,自定义item key进行测试。需在zabbix-server 端 切换目录: cd /usr/local/zabbix/bin 执行查询命令: ./zabbix_get -s 192.168.174.132 -p 10050 -k …

Bat批处理中的 FINDSTR用法

linux中的grep等同于win中的findstr命令。可以在txt文本中截取到有特定关键字的行,并显示出来。 grep也可以通过关键字,在一个文件夹下查找多个有这些关键字的文件,并生成结果。 一、findstr命令介绍 findstr是Windows系统自带的命令,简单来说…

chatgpt赋能Python-python_end的用法

简介 Python是一种广泛使用的编程语言,被广泛应用于数据科学,机器学习,网络编程,Web开发等领域。Python内置了许多有用的操作符和关键字,其中包括end。end是Python中一个非常有用的操作符,它可以在将多个输…

C001--Visual C++ 6.0集成开发环境的下载与安装并运行简单的C语言程序

visual c的下载安装过程不复杂,只需要运行setup.exe程序,然后按照安装程序的提示信息进行操作,也可以指定系统文件存放的路径。 目录 一,下载安装集成开发环境 1,流程 2,熟悉visual c工作界面 二&am…

Element-UI介绍:主题定制、自定义组件和插件扩展

部分数据来源:ChatGPT 什么是Element-UI Element-UI是一款简单好用的前端UI库,基于Vue.js开发。它提供了常用的组件和样式,可以帮助我们快速地构建美观、实用的交互界面。 在使用Element-UI开发项目过程中,我们有时遇到了一些特…

chatgpt赋能Python-python_dim

Python dim:将维度降至极致 在机器学习和数据分析领域,我们经常需要处理高维数据。然而,高维数据不仅处理起来麻烦,而且往往也不利于数据分析和模型训练。因此,数据科学家和工程师需要一个有效的方法来降低数据维度。…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

python笔记 第一章

学习用到的资源链接:https://pan.baidu.com/s/1Ftptx_9iH9xFYj3NbugMrg?pwd1234 提取码:1234 文章目录 1.1 简介Python版本 1.2 解释器下载Python解释器安装Python解释器验证是否安装 扩展 1.3 PyCharm安装PyCharm基本使用新建项目设置只看项目文件运行…

【深度学习】- 作业6: 图像自然语言描述生成

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

2023 华为 Datacom-HCIE 题库 04--含解析

单选题 1.[试题编号:189921] (单选题)防火墙双机热备场景下,当VGMP工作在负载分担模式时,为了避免在来回路径不一致的场景下回程流量因没有匹配到会话表项而丢弃的现象,防火墙需要启开一下那些功能&#x…

【vim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装)

文章目录 一、vim简介二、vim操作2.1 三种模式及其切换2.2 常用命令2.21 命令模式下常用命令2.22 底行模式下常用命令 三、vim进阶3.1 进阶操作3.11 可视化模式3.12 正则表达式3.13 结合其他文本处理命令3.14 修改文件属性(编码、格式、权限) 3.2 进阶配…

cpu压力测试、平均负载、切换上下文(linux)

和windows下有很多图形化测试工具不同,linux下的压力测试通常需要命令行 一、平均负载 1.查看命令 uptime会给出类似如下的信息 2.说明 三个数值代表1分钟,5分钟,15分钟的平均进程数。 换成更容易理解但不准确的说法就是几个核满载 比如…

目前前端流行的框架总结

框架 前端框架 前端框架一般指用于简化网页设计的框架,使用广泛的前端开发套件,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件&#x…

取余,取模

目录 一:取整方式 1:向0取整 --- trunc取整函数 2.向-∞取整 --- floor(地板)函数 3.向∞取整 --- ceil函数 4.四舍五入取整 --- round 函数 5.四种取整方式的对比 二:取模 1.引入 2.取模与取余等价? 一&a…