什么是模型轻量化?如何自动进行模型轻量化?

news2024/11/26 18:44:20

轻量化是已经是3D可视化业界人所共知的一个概念,虽然至今没有任何严谨的学术或者理论定义,但是这个概念已经几乎成为了行业的标准。它的大意是说,一个适用用于浏览器端渲染的模型数据,包括几何数据和行业数据,必然可以做的很小,如果和原建模软件的原始模型文件比较的话,如果做到1/4那是及格标准,做到1/10,乃至1/20之一是优秀。今天我们将讨论下这个概念下具体的技术实现方案和背后的计算机图形学理论,并且希望得出一个对整个行业有参考价值的结论。

定义

在讨论轻量化的可行技术方案之前,我们需要对轻量化进行一个定义和概念厘清。本文所探讨的轻量化,指对三维建筑模型模型,例如Revit,IFC等文件中三维几何数据部分的数据压缩。本文针对的轻量化不涉及任何其他非三维几何数据,包括纹理图片、材质信息、建筑BIM信息、二维图形信息以及软件特有的附加信息。很多平台产品将自己的纯三维几何数据大小和带有众多信息的原模型大小相对比,得出自己轻量化程度高的结论是非常不科学的。

我们需要对三维几何信息进行进一步定义。这里的三维信息特指三维三角形网格(triangular mesh)或者三维线网格(polyline mesh)。每一个mesh由一个顶点数组和一个索引数组组成。顶点数组中每一个顶点一定包含position,即三个32bit IEEE754 floating number,分别对应顶点的x, y, z坐标,可能包含normal,即三个32bit IEEE754 floating number,可能包含纹理坐标UV,即两个32bit IEEE754 floating number,可能包含顶点颜色,即四个8bit byte,分别对应RGBA四个通道。针对三角形网格,因为考虑渲染效率,一定采用顶点法线(vertex normal),而不是面法线(face normal)。索引数组为一个unsigned int 16的数组,元素个数为3 * 三角形数量或者2 * 线段数量。

除了定义mesh,我们进一步定义轻量化的应用场景。轻量化仅指进轻量化程序处理后用于保存和网络传输的数据量可以压缩到比原始三维网格的数据量小。在进行渲染前,轻量化的数据可能会解压缩以便是适配于GPU渲染API的需要,解压缩的数据量可能会增大,甚至比原先的三维网格数量量更大,这是为了渲染效率优化的考虑。本文所讨论的轻量化仅针对优化存储优化和传输优化,并不针对渲染的优化。同时,我们认为因为渲染的API的接口规范已给定,渲染时实现100%还原度的无损数据压缩是不存在的,虽然本文最后对这类应用情况也提出了一种可行性方案。

技术方向

轻量化的技术方向大致可以分为Instancing,Compression,LOD和Parameterization。下文对四个技术方向以及其落地分别进行探讨。

  • Instancing

Instance,多实例是已经非常普遍的渲染技术[2]。它的原理是针对同样的几何物体,只保存一份几何数据,通过在渲染管线中分别绘制若干次,且每次应用不同的几何变化和材质信息得到在同一帧多个类似几何物体的渲染效果,见图1。用实际的例子说,如果要绘制很多相同的桌子,我们只需要使用一份桌子的几何数据,然后绘制多编,每一遍把桌子放在不同的位置即可。目前的渲染管线已经完全将instancing放在了硬件管线中执行,大大节约了GPU内存的开销和CPU的计算开销(主要指发起一个drawcall的驱动使用CPU资源)[1, 3]。WebGL 1.0中可以通过使用ANGLE_instance_arrays[3]就扩展实现这个功能,在WebGL 2.0中已经有原生API支持,即gl.drawElementsInstanced。

对应轻量化的Instancing表达,已经有一定的研究[4,5]。研究的主要解决问题,如何在一个场景中,对几何体进行一一对比,如果两个几何体是同一个几何体,那么只需要实际保存一份几何数据,将另外一个几何体压缩为一个空间变化和材质信息。判断两个几何体是否相同往往从附加在几何体上的语义出发,例如两个几何体是不是都标记为一张桌子,或者直接从mesh相似度出发。纯几何的算法是非常具有挑战性的,因为单纯的内存比较显然在大多数情况下不适用,只要索引数组略有变化或者一个简单的平移变换,这种比较就失效了。现在业界应用比较多的是Hausdorff距离[6],即计算两个mesh之间的最小欧式距离。这个距离算法一样对简单的旋转无能无力。

另一方面在建筑建模中,我们发现大多数的建模软件已经内置了Instancing的功能。一个物体如果在场景中重复出现多次,在模型文件中它的几何数据只保留了一份,每一个实例压缩为了一个4x4空间变换矩阵。这样的发现告诉我们,在BIM的数据流中想通过instancing来减少几何数据的大小已经不太现实,源文件已经在这个方面做到了最好。

综上所述,在实际的生产环境中,利用Instancing来减少原始文件的尺寸,效果不会太好。

  • 压缩

压缩的概念就很好理解,就是和普通的文件压缩类似。有两种方向,第一种是几何无关的,例如直接用将模型数据进行gzip压缩后保存,因为浏览器原生支持gzip解压[7],在传输过程还是gzip压缩数据,而在应用层已经为解压后的模型数据,根据我们经验,针对上文中提及的几何数据,gzip的压缩率在2:1,即能压缩到原始数据一半的大小。第二种方向是几何相关的,比如Google的Draco库[8],Khronos的Open3DGC[9]。Draco的公开资料中并没有提及它的具体算法,但是它的压缩率是惊人的,见图2。对于Open3DGC,它在一定程度上利用了quantization的方法,是一种有损压缩。虽然他们加入了针对几何信息更好的压缩,但是本质上还是一种压缩算法,需要在载入到GPU前将数据解压缩。

压缩是目前在轻量化中实用价值最高的方法,原因是它完全对于渲染透明,且在服务器端保存的几何数据量大幅度减少,所需要的无非是一些计算性能的开销,例如Draco解压一个100MB左右的文件需要1秒左右的CPU时间。

  • LOD

Level-of-Detail(LOD)[11, 12],一个渲染加速技术,对于离相机原的物体采取比离近的物体精度低的多的几何数据,甚至一个billboard来表达。这样在一个帧内就能大大减少vertex数量,减轻渲染管线的计算量,见图4。LOD某种程度上可以会被误认为一种简化mesh模型的技术容易把LOD混同轻量化来谈,这是一种认识误区,正如前面所述,LOD是一种渲染加速技术,它不但不能减少文件保存时和传输时的尺寸,还是需要增加文件尺寸的。例如图4中,除了原始的最左边的模型,模型处理程序还需要构建出右边三个简化模型,将其传输到客户端用于渲染加速。额外的三个简化模型大大增加了模型的数据尺寸。

但是也有通过quantization方法,在不增加文件尺寸的基础上提供了LOD技术[13](图5)。它把模型的定点坐标的floating number全部转换为normalized整形,然后依靠cutting off来实现downsampling。这是一个非常巧妙的办法,唯一的开销是在vertex shader中需要将normalized floating number展开。

图5 Pop Buffer利用quantization来做LOD

LOD虽然不能直接降低模型的几何数据大小,但是依据LOD的层级可以实现模型几何数据的增量传输(progressive loading),也就是先传输低层级的几何数据且显示,最后再传输那些更加细致的几何数据。如果用户允许一定程度上的几何细节损失,LOD也可以成为一种轻量化方法。对于模型简化的算法可以参考[14, 15, 16]。另一个非常类似的研究方向是mesh streaming,更多的应用于大规模地形模型的渲染。

  • Parameterization

参数化这个做法就是将mesh转成nurbs或者其他参数表达方式。这个技术本来是在逆向工程中使用,从激光扫描的点云中恢复参数曲面用来车床加工[20, 21, 22]。对于参数易表达的面,比如球体,这种方式大大减少了数据量。但是对于建筑来说,大多数面片都是平面,并不能减少太多数据量,甚至在有些情况曲面消耗的存储空间比mesh更大,比如带很多trim的曲面。何况GPU并不支持参数曲面的实时绘制。

还有两种类似参数化的方法,分别是remeshing即重新mesh[23],见图6和subdividision 曲面细分[24],见图7。前者将mesh重新采样做成一个新的mesh,后者将一个曲面细分,生成一个更加复杂的曲面,实质上是生成一个由原先曲面作为控制点的b-spline surface。理论上,我们只要找到一个和现有mesh几何相近但是更简化的表达,就达到了压缩的目的,但是这样做并不容易,原因还是建筑模型中大多数的几何体并不适用于细分曲面。

图6 Remeshing

图7 细分曲面

但是参数化表达并无不可取之处,对于几种特殊的情况,参数化表达可以达到非常好的效果。比如管道等利用extrusion操作生成的物体结构,见图8。这样的扫描体完全可以用一条路径加一个横截面来表达,如果横截面为一个方便公式表达的形状,例如圆形,那么数据压缩的效果会更加明显。为了进一步减轻客户端将这种参数表达的形体展开为mesh的工作量,我们可以将path中的采样点预先计算出来。

一个可行性数据压缩框架

上文已经总结了可用于压缩的四个基本方向,我们认为并不存在一个适用于普遍场景的“轻量化”方案。一个相对可行性方案也是Modelo采用的是

  1. 保存原建模文件中的instancing信息
  2. 如果原建模文件中有NURBS曲面(b-rep),控制它的网格细分力度,取得效果和文件体积平衡。
  3. 对于extrusion物体进行参数化,将其压缩所成line strip和一个横截面
  4. 采用Google Draco对其进行压缩
  5. 采用gzip将其压缩

对于一般场景,这个方案最终的压缩率几乎取决于第四步Draco的压缩表现,这也是为什么我们认为“轻量化”的更应该称之为“几何数据压缩”的原因。只有对于极少数的场景,例如可以简化的管道,第三步就可以发挥极大的作用,大大降低文件尺寸,但是这步的工程实现难度也很大,需要考虑很多细节,这里也不一一阐述了。

 总结

三维模型轻量化技术可以通过多种方式来减少模型文件大小和处理负荷,从而提高三维模型的性能和运行效率。在实践中,可以根据具体的应用场景和需求选择最适合的轻量化技术来优化三维模型。

老子云3D可视化与模型优化服务平台icon-default.png?t=N7T8https://www.laozicloud.com/

老子云单模型轻量化

通过底层算法快速有效的对单物品模型进行轻量化处理,目前包含三种处理模式:减面模式、合并模式、抽壳模式(其他模式陆续上线中)。

减面模式

保留原始模型信息,仅使模型网格更轻量。

目标面数: 服务后模型的百分比面数,目标面数百分比越低,轻量化效果越明显。

目标格式: FBXOBJSTL

GPU轻量化: 相比CPU轻量化,处理速度更快,精细化程度更佳。您可选择是否开启GPU轻量化。


合并模式

合并模型材质和贴图,不保留原始UV信息(可选择是否保留原始模型网格和动画)。

目标面数: 服务后模型的百分比面数,目标面数百分比越低,轻量化效果越明显。

目标格式: FBXOBJSTL

漫反射贴图精度: 表现物体表面反射和颜色的贴图(如果模型有漫反射贴图或非白色材质颜色信息,会开启漫反射烘焙)。精度取值范围1024-8192。

烘焙AO贴图: 包含光照数据的灰度贴图,模拟物体之间所产生的阴影。

保留模型网格和动画: 开启后仅合并所有材质和贴图。

抽壳模式

完全忽视内部结构,仅保留表层展现,以求更极致的轻量化及更高效的展示效果,适用于BIM在大场景中的LOD生成

倾斜摄影轻量化

适用于倾斜摄影OSGB模型的多端展示与交互,自动切割为多区块多层级,根据人眼自动识别来实现模型不同区块不同层级的精度加载。

目标精度: 可自行设置服务后模型的目标精度,线上提供普清、标清、高清、超清四种效果选择。

目标格式: AMRTOSGB、3DTiles

老子云3D可视化与模型优化服务平台icon-default.png?t=N7T8https://www.laozicloud.com/

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

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

相关文章

数据库、中台、报表平台之间的关系

我最近在接触报表平台和中台,发现他们跟我平常用的数据库不是一个东西。然后,我开始了摸索他们的过程,终于,我在理清他们的关系以后,简单写一个入门级的区分。 数据库: 定义: 数据库是被长期存…

MySQL 下载及安装教程

MySQL是一款开源的关系数据库管理系统,被广泛应用于各种应用程序和网站的数据管理中。以下是下载和安装MySQL的详细步骤。 1. 访问MySQL官方网站 首先,打开你的浏览器,访问MySQL官方网站: MySQL官方网站: https://www.mysql.com …

同三维T80004EHU 高清HDMI/USB编码器

1路HDMI或1路USB输入,带1路3.5音频输入,高清1080P60 来百度APP畅享高清图片 产品简介: 同三维T80004EHU 高清 HDMI/USB编码器是一款1路HDMI或1路USB高清编码器,。可将 HDMI 或USB视频源编码压缩成网络流,通过有线网络…

springboot 3.x 之 集成rabbitmq实现动态发送消息给不同的队列

背景 实际项目中遇到针对不同类型的消息,发送消息到不同的队列,而且队列可能还不存在,需要动态创建,于是写了如下代码,实践发现没啥问题,这里分享下。 环境 springboot 3.2 JDK 17 rabbitMQ模型介绍 图片…

银河麒麟系统升级openssh至9.7p1

银河麒麟系统升级openssh至9.7p1 升级过程建议参照链接 https://blog.csdn.net/zt19820204/article/details/137877652 当前环境 开始安装 # 1.查看当前服务器的openssh版本 ssh -V# 2.openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/# 3.升级opens…

想停,不可能!

转融通出借数量突然暴增,逼得证监会火速出来辟谣,这是坊间这几天传得(最)火的事。 事情呢,一句话概括就是光6月12号那一天,就新增了1.7亿股,吓得大家都说是转融通疯狂报复来了!但官家…

Google 新 AI 为视频生成配乐和对白;Runway 发布 Gen-3 视频生成模型丨 RTE 开发者日报 Vol.226

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

烟雾自动监测识别摄像机

烟雾自动监测识别摄像机是现代城市安全管理的关键装备,其在各类场所的应用日益广泛,尤其在大型建筑、工厂和公共设施中,其重要性更为突出。该类摄像机采用先进的传感技术,能够实时监测环境中的烟雾密度和变化。通过高灵敏度的传感…

批量创建文件夹 就是这么简单 一招创建1000+文件夹

批量创建文件夹 就是这么简单 一招创建1000文件夹 在工作中,或者生活中,我们经常要用到批量创建文件夹,并且根据不同的工作需求,要求是不一样的,比如有些人需要创建上千个不一样名称的文件夹,如果靠手动创…

开发淘宝在线扭蛋机小程序:关键点与实战技巧

引言 在上一篇文章中,我们介绍了开发淘宝在线扭蛋机小程序的基本步骤和前期准备。但在实际开发过程中,还有一些关键点和实战技巧需要特别注意。本文将为您详细阐述这些关键点和技巧。 一、关键点 用户体验: 简洁明了的界面设计&#xff0c…

AI 视频生成工具 Sora 横空出世!一文带你了解 Sora:简介|主要功能|使用场景|平替工具等!

要说最近的头条热搜,非 Sora 莫属!Sora 的诞生,再一次引发了人们对 AI 人工智能以及 AIGC 的关注。 对第一次听说 Sora 的人,可能会好奇,大家都在说的 Sora 是什么? Sora 是什么软件? Sora&a…

录制视频软件哪个好?录制视频,4款好软件推荐

随着网络技术的飞速发展和社交媒体的普及,录制视频已经成为人们记录生活、分享知识和展示才华的重要方式。在众多录制视频软件中,如何挑选一款功能强大、操作简便的工具,成为了许多用户的难题。本文将为您推荐4款优秀的录制视频软件&#xff…

守护电力心脏:国网电力监控运维平台的智慧使命

国网电力监控运维平台,以其强大的数据分析和处理能力,实现了对电网运行的实时监控。无论是电压波动、电流异常,还是设备故障,平台都能迅速捕捉并发出预警,确保电力供应的稳定和安全。 山海鲸可视化电力监控运维平台 想…

Unity引擎UGUI上特效处理重叠和裁剪问题的多种解决办法

大家好,我是阿赵。   使用Unity引擎开发项目,使用UGUI做界面,经常会遇到需要把特效放在UI上,但UI本身和特效又需要有遮挡关系和裁剪效果。   之前我介绍了一下使用MaskableGraphic的方式把粒子特效渲染在UI上,把粒…

闲鱼平台与宝藏详情API接口

一、闲鱼平台简介 闲鱼,是我国知名二手交易平台,成立于2015年,隶属于阿里巴巴集团。联讯数据用户可以在闲鱼上买卖二手商品,实现闲置物品的流通与再利用。随着我国互联网经济的快速发展,闲鱼平台用户规模不断扩大&…

升级你的App推广策略!Xinstall用户来源朔源功能引领行业新潮流

一、引言 在App推广和运营的道路上,你是否曾经遇到过这样的困境:投入了大量的资源,但用户增长却迟迟不见起色?或是用户增长迅速,但用户留存率却极低?这些问题,往往源于我们对用户来源的不了解。…

自监督几何引导:开启单目视觉里程计的鲁棒新时代

论文标题: Self-Supervised Geometry-Guided Initialization for Robust Monocular Visual Odometry 论文作者: Takayuki Kanai, Igor Vasiljevic, Vitor Guizilini, Kazuhiro Shintani 导读: 本文提出了一种用于单目视觉里程计的自监督几…

全国各城市劳动力就业及收入状况数据

基本信息. 数据名称: 全国各城市劳动力就业及收入状况数据 数据格式: Shp、excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源:网络公开数据 数据可视化.

回溯算法练习题(2024/6/18)

1全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出:[[1,…