|
将物理空间的实际物体与虚拟空间的虚拟事物进行不同保真度的映射,是大家对数字孪生的一个初步理解。数字可视化在数字孪生中扮演了一个有待深挖的角色,它的表达常伴随指引、决策、整合、控制的多重身份。如何将大量无关联、脱离感比较强、相对抽象的数据映射,通过现有电子设备被更多不同领域的人理解和应用,是Raydata可视化系列产品在努力实践中的事,以下是相关的一些经验总结,希望能抛砖引玉对大家产生一些启发。
1.RayData 是什么?
可视化是一个应用比较广泛的行业。理论上,只要有数据展示需求,就会有可视化发挥的空间。小到一个图表,大到一个智慧城市可视化管理平台,有的团队专注于某一细分领域,有的团队一直在拓宽行业边界,无论如何理解可视化,它应该始终是一个考验设计师和开发者协作能力的行业。
RayData 大数据可视化交互管理系统,以可视化定制项目形式服务了智慧城市/政务/能源/建筑/园区/文旅/金融/医疗等领域的多家客户。
图1-项目截图
图2-项目截图
图3-项目截图
要制作一个商业级 3D 可视化项目,涉及到的制作环节比较多,包括:建模、GUI 设计、图表设计、场景编辑、视效、动效、数据对接等,这对交付周期和团队建设都是比较大的挑战。为了让更多从业者以较低门槛参与到可视化项目交付中,我们基于过往项目经验,通过封装行业模板,丰富资产库,简化制作流程等,开发了一系列 RayData 可视化产品,从资产编辑工具,到资产商城,再到项目编辑工具,旨在帮助设计师、开发者通过低代码方式快速搭建出满足不同业务需要的 3D 可视化项目。我们针对不同用户群体,分别推出了商业版、专业版和个人版可视化项目编辑工具。
2.游戏引擎的选择
RayData 可视化项目的主要特点有:
1. 以 3D 场景作为故事背景,支持多种类型的模型数据接入。
2. 注重渲染效果,无论是写实还是风格化,能根据项目需求灵活创作。
3. 注重视觉交互,对动画系统能否完成复杂任务有一定的要求。
4. 大部分工作能在图形化编辑器里完成,降低学习门槛,以低代码方式完成项目交付。
所以,综合以上主要特点,我们决定在传统可视化工具链中引入游戏引擎。
游戏引擎一般包含了渲染引擎、碰撞及物理引擎、动画系统、音频系统、游戏世界对象模型和人工智能系统等常见核心组件。
目前,主流的游戏引擎有 Unity 和 Unreal Engine,两者定位和现状稍有不同,但都支持发布至多个平台,比如:Windows、macOS、Linux、iOS、Android 等,同时,它们都可以通过 Emscripten 编译出 WebAssembly 项目,使其支持在 Web 端运行。Unreal Engine 从 4.24 版本起,对 HTML5 平台的支持已从引擎转移到公开的平台扩展上,由社区成员维护和改良。
现在这两大游戏引擎厂商都在逐步拓展非游戏领域市场,定位有所变化,这是非游戏领域开发者的福音,这点也许从各自官网对引擎的定义中就能看得出来。
Unreal Engine 是一款先进的实时 3D 创作工具。
总体来看,Unity 上手较容易,开发效率较高,社区较大,国内从业者较多,商城资源丰富等。所以,综合考虑后,我们选择了 Unity。
我们的 RayData 专业版和个人版可视化工具集成了 Unity 运行时环境,用户可以在 RayData 工具中利用内置的 3D 资源搭建项目,也可以在 Unity 编辑器中完成 3D 场景搭建,将成果发布至 RayData 支持的目标平台,进入 RayData 工作流快速完成 3D 可视化项目的搭建工作。以 Web 端为例,最终,我们可以通过 DOM 或者上层应用框架实现 GUI,通过 Canvas 上的 Unity 运行时环境渲染 3D 场景。
正如之前提到的,通过 Unity 构建 WebGL 项目的原理是:Unity 运行时代码(用 C 和 C++ 编写)通过 Emscripten 编译器工具链交叉编译为 WebAssembly(也称为 Wasm),.NET 游戏代码(C# 脚本)需要先通过 IL2CPP 技术转换为 C++ 代码,然后再通过 Emscripten 编译为 WebAssembly。
在实际项目中,我们遇到的最多的应用场景是通过 2D 控件控制 3D 场景中的对象,这时可以通过 SendMessage() 方法从浏览器的 JavaScript 向 Unity 脚本发送一些数据或通知。
unityInstance.SendMessage(objectName, methodName, value);
SendMessage() 方法中,objectName 是场景中的对象名称;methodName 是当前附加到该对象的脚本中的方法名称;value 可以是字符串、数字,也可为空。例如:
unityInstance.SendMessage('Building', 'PopupWindow', 'Name');
使用 Unity WebGL 能给我们带来跨平台、渲染效果好等方面的优势,但其本身也存在一些不足。
由于 JavaScript 是单线程,所以在 Unity 内部使用线程来加速性能以及在脚本代码和托管的 dll 中使用多线程都是不支持的(实质上不支持 System.Threading 命名空间中的任何内容)。
我们都知道,由于存在安全隐患,JavaScript 代码无法直接访问 IP 套接字来实现网络连接。因此,.NET 网络类(即 http://System.Net 命名空间中的所有内容,特别是 System.Net.Sockets )在 WebGL 中不起作用。Unity 旧有的 UnityEngine.Network 类也是如此,以 WebGL 为构建目标时无法使用这些类。如果需要在 WebGL 中使用网络,当前可选择的做法有:
1. 使用 Unity 中的 WWW 或 UnityWebRequest 类;
2. 使用基于 WebSocket 协议实现的新型 Unity 网络功能;
3. 使用 JavaScript 中的 WebSockets;
4. 使用 WebRTC 来自行实现。
3.3D渲染
RayData 常以 3D 场景作为故事背景,以 2D/3D 控件承载业务数据,最后借以实时三维渲染技术,为客户提供可视化解决方案。
三维场景渲染的本质一般涉及如下几个步骤:
1. 描述一个虚拟场景,场景一般是指用数学形式表现的三维表面。
2. 设置虚拟摄像机,为场景取景。
3. 设置光源。光照是所有计算机图形渲染的中心,缺乏良好的光照,原本精致的模型场景会显得平面及不自然。
4. 描述场景中物体表面的视觉特性,比如:纹理、材质等。渲染的关键在于,如何正确地模拟光和场景中物体交互作用的行为。所以渲染师要理解光如何工作,如何在环境中传递。
5. 求解渲染方程或着色方程,即计算全局光照模型。从某种意义上说,所有渲染技术都可视为此渲染方程的完全或部分解,尽管每个技术的基本方法、假设、简化方式、逼近方式有所不同。
4.渲染管线
渲染管线是一连串的顺序计算阶段,每个阶段有其具体目的,各个阶段会操作输入流中的数据项,并对输出流产生数据。一般可分为如下几个阶段:
1. 工具阶段(脱机):定义几何和表面特性(材质)。
2. 资产调节阶段(脱机):处理几何和材质数据,生成引擎可用的格式。
3. 应用程序阶段(CPU):识别出潜在可视的网格实例,并把它们及其材质呈交至图形硬件以供渲染。
4. 几何阶段(GPU):把顶点变换、照明,然后投影至齐次裁剪空间。可选择用几何着色器处理三角形,然后对三角形根据平截头进行裁剪。
5. 光栅化阶段(GPU):把三角形转换为片段,并对片段着色。片段经过多种测试(深度测试、alpha 测试、模板测试等)后,最终和帧缓冲混合。
Unity 的可编程渲染管线(SRP) 是内置渲染管线(Built-in) 的替代方案,可通过 C# 脚本控制和定制渲染方式。Unity 已经提供了两个基于 SRP 框架的可编程渲染管线,分别是:高清渲染管线(HDRP)和通用渲染管线(URP,前身是轻量级渲染管线 LWRP)。我们之所以要从 Built-in 升级到 URP 或 HDRP,主要是考虑到渲染能力和 SRP 框架带来的自由性。
常规项目中我们会考虑使用 URP。URP 使用了简化的、基于物理的光照和材质,它的适用范围更广,无论是移动端还是桌面端,都可以实现高质量的快速渲染。同时,URP 使用单通道前向渲染,可使其在多个平台上获得优化的实时性能。
在以智慧城市、智慧制造、智慧建筑等为背景的项目中我们会考虑使用 HDRP。HDRP 使用了基于物理的光照和材质,并且支持前向渲染和延迟渲染,同时,HDRP 使用了计算着色器 (Compute Shader) 技术,因此需要兼容的GPU硬件来支持。这些决定了 HDRP 主要面向高端硬件,可用于 AAA 级高品质游戏、汽车演示、建筑应用以及任何高清图形优先于性能的应用,可在严苛的条件下获得逼真的图形。
5.光照
局部光照模型(Local Illumination Model):只考虑直接光照(Direct Lighting),光被发射后,碰到单个物体后反射,直接进入虚拟摄像机的虚拟平面,不会影响其他物体的光照。
全局光照模型(Global Illumination Model):除了直接光照,也考虑到了间接光照(Indirect Lighting),光被多个表面反射后才进入虚拟摄像机的虚拟平面。
全局光照模型应用场景有:
1. 视觉现象,例如:产生逼真的阴影、模拟反射性表面、考虑物体间的互相反射(如:某物体的颜色会影响其邻近物体的颜色)、模拟焦散(Caustics)效果(如:水面或光滑金属表面的强烈反射)。
2. 光学现象,例如:光线追踪(Ray Tracing)、辐射度算法(Radiosity)。
Cookie 是灯光投射的 RGB 纹理,将其放置在灯光上,可以创建具有特定形状或颜色的阴影,从而改变灯光的外观和强度。Cookie 也是一种模拟复杂照明效果的有效方式,对运行时性能的影响比较小,可以用来模拟焦散、柔和的阴影和光的形状。
环境光遮蔽(Ambient Occlusion, AO)是来描绘物体和物体相交或靠近时遮挡周围漫反射光线的效果,可以解决或改善漏光和阴影不实等问题,可以让局部的细节画面尤其是暗处的阴影更加明显一些,增强了空间的层次感、真实感。
在传统基于三角形光栅化的渲染中,所有光照和着色计算都是在观察空间中的三角形片段上计算的。这样带来的问题是,我们可能做了许多不必要的工作,比如:我们替三角形顶点着色,但可能在光栅化阶段才发现整个三角形会被深度测试所剔除。虽然,早期深度测试可协助消除像素着色器的计算,但效果不是很好。
此外,为了处理含多个光源的复杂场景,我们最终会产生大量不同的顶点及像素着色器版本,每个版本处理不同数量的光源、不同种类的光源、不同数量的蒙皮权重等。
在延迟渲染(Deferred Rendering)技术中,主要的光照计算是在屏幕空间进行的,而非观察空间。原理是:先迅速渲染完不含光照的场景,同时,将所有用于光照计算的信息储存在几何缓冲(Geometry Buffer, G-buffer)中,完成场景渲染后,再使用几何缓冲的信息来计算光照和着色。
6.效果
如果要在场景中添加局部体积雾,可以通过密度体积(Density Volume)来实现。密度体积在 Unity 中是一种表示为定向包围盒的加法雾效体积。默认情况下,雾是恒定的(均质),但可以通过在 Density Mask Texture 部分下的 Texture 字段中指定 3D 纹理来进行更改。
全屏后处理效果(Full-Screen Post Effect)应用在已渲染的三维场景上,以增加真实感或做出特殊的风格。这些效果的实现方法,通常是把屏幕的所有内容传送至所需效果的像素着色器,而实际过程就是把含未处理场景的贴图,以一个全屏四边形进行渲染。比如:
1. 动态模糊(Motion Blur):此效果通常的实现方法为,渲染一个屏幕空间的速度矢量缓冲区,并使用此矢量场选择性地模糊已渲染的影像。产生模糊的方法是把一个卷积核(Convolution Kernel)施加于影像。
2. 景深模糊(Depth-of-Field Blur):此模糊效果使用深度缓冲区的内容调整每像素的模糊程度。
7.其他
多重采样抗锯齿(Multisample Antialiasing, MSAA)原理是:把每个像素分拆为多个片段,这些片段在管道最后阶段结合成单个像素。(现在的 GPU 通常能支持 4x 及 8x 的多重采样。)
临时性抗锯齿(Temporal Antialiasing, TAA)原理是:把多次采样的过程分布到每一帧中去,也就是每一帧都利用前面几帧保存下来的数据。TAA 相比 MSAA 有更高的质量且更低的功耗,能更好地处理镜面光照、纹理或透明效果中的锯齿,在一些情况下,TAA 甚至可以单独承担摄像机的抗锯齿。然而,由于此方法的临时性,它依赖之前帧的数据和运动矢量(Motion Vector),在处理快速运动的镜头和对象时,TAA 可能会产生额外的重像,还会稍微柔化图像,好在我们可以在 HDRP 的摄像机组件中进行TAA 图像锐度控制。
以外滩为中心的上海部分场景作为展示区域进行举例,这个项目渲染管线采用了 HDRP。
制作场景前,我们把模型拆分成了若干块,这样做的好处是可以更灵活地控制每一块模型的细节和颜色变化,也便于修改模型,优化模型加载策略。
场景效果方面,我们运用 Volume 中的 Fog 再配合密度体积(Density Volume)来模拟场景远处的雾气效果;通过屏幕空间反射(Screen Space Reflection, SSR)来模拟楼体与水面的反射效果;通过 Bloom 来模拟泛光效果;通过环境光遮蔽(Ambient Occlusion, AO) 来模拟场景凹陷部分的微量光遮蔽效果,减少一些反射光侧漏,使场景效果更加真实。
材质方面,我们把所需材质按照墙体、玻璃、金属、房顶和环境等进行分类。大部分材质球使用了默认着色器(Lit Shader),远处的建筑为了节省贴图资源,用到了分层着色器(Layered Lit Shader)。通过层遮罩(LayerMask)来区分墙体和玻璃质感。通过调节 Triplanar Mapping,来模拟大片建筑的窗户密集效果。类似东方明珠塔这种标志性建筑,我们会用 Substance Painter 来制作出逼真的材质效果。通过 ShaderGraph 来模拟水的效果。
动画方面,我们运用 Cinemachine Dolly Cart and Track 来模拟汽车和船只在真实世界中的运动轨迹。
灯光方面,在日出这个场景中,会有阳光穿过云层形成体积光束的效果,我们通过使用 Cookie 来模拟光被云层遮挡阴影,再对应调节密度体积(Density Volume)的数值来模拟。因日出时整体环境偏暗,所以可以在 Volume 中通过间接光照调节器(Indirect Lighting Controller)来调节间接光照的强度,进而达到更好的效果。通过聚光灯(Spot Light)模拟体积光(Volumetric Light)来照亮场景中较暗的地方,同时,将渲染阴影分辨率 Shadows Resolution 设置为 High Resolution 的话阴影效果会更好。
最终我们选择了前向渲染(Forward Rendering),前向渲染通常比延迟渲染(Deferred Rendering)的画质要高,迄今为止,它是唯一一个能快速使用更优阴影过滤技术的模式。
我们启用了多重采样抗锯齿(MSAA)功能,希望图像要尽可能清晰一些,所以抗锯齿倍数选择了 8 倍,虽然这样做性能消耗会大一些。同时,我们还在后处理(Post Processing)阶段启用了临时性抗锯齿(TAA)功能,这可以更好地处理镜面光照、纹理或透明效果中的锯齿。
7.应用
热力图在可视化项目中比较常见,常用来表示区域人流密度,帮助我们及时了解区域客流压力,提前疏散人群,规避一些风险。
Web 端绘制热力图的 JavaScript 库比较多,比较常用的是:<a href=&#34;https://www.patrick-wied.at/static/heatmapjs/&#34; h&#34;=&#34;&#34;>
在可视化项目中一般会通过粒子系统或叠加 2D 图层的方式来实现热力图效果。以下是一些效果图和实际案例截图:
在一些智慧城市、城市规划类可视化场景中,用户会关注一些专业 GIS 功能,比如:加载倾斜摄影数据、进行可视域分析、空间测量等。目前比较著名的 GIS 厂商有美国 Esri 公司、美国 AGI 公司和中国超图公司,这些 GIS 厂商分别开发了自己的 GIS 平台:ArcGIS、Cesium(开源)和 SuperMap GIS,GIS 平台通常以 SDK 形式让开发者可以实现诸如多源数据接入、空间查询、空间分析等专业的 GIS 功能。
超图是我们国内领先的 GIS 软件厂商,于 2020 年底推出了面向 Unity 的 SuperMap Scene SDK,它是超图基于 SuperMap GIS 新一代三维 GIS 技术与 Unity 游戏引擎深度集成的一个开发平台,支持影像、地形、倾斜摄影模型、人工模型、BIM 等多种海量 GIS 空间数据的本地/在线浏览、查询、空间分析等多种功能,可广泛用于智慧城市、军事、气象等多个行业。
目前,SDK 支持的数据类型有:三维影像缓存文件(*.sci3d)、三维地形缓存文件(*.sct)和三维切片缓存文件(*.scp),这些数据可以通过本地服务和在线服务进行加载。SDK 支持 Unity 2019.4 及以后版本,要注意的是,安装 SDK 后要将 BIN 包路径添加至系统环境变量。
基于 SDK,我们可以在基于 Unity 的可视化项目中实现以下功能:
1. 属性查询:点击模型可以查询并显示相关属性,支持属性字段自定义展示。主要适用场景:手工建模模型、 BIM模型。
2. 场景裁剪:对模型进行 BOX 裁剪,从而查看模型内部结构,BOX 尺寸支持自由调节。主要适用场景:BIM 模型、手工建模模型、倾斜摄影数据。
3. 等值线分析:对地形进行等值线分析,分析后可以更改显示模式、线颜色、纹理颜色列表、透明度、最小高程、最大高程、等值距等。主要适用场景:地形影像数据。
4. 通视分析:以某一点为观察点,研究某一区域通视情况,绿线代表视野区,红线代表视线盲区。
刚才,我们了解了 RayData 可视化项目中的 3 个应用,最后,我跟大家分享一下 RayData 对可视化行业趋势的一些展望。
8.展望
2016 - 2018 年,世界知名 IT 咨询公司 Gartner 连续三年将数字孪生列为十大战略科技发展趋势。
2019 年,Gartner 认为数字孪生处于期望膨胀期顶峰,将在未来 5 年产生破坏性创新。
所以,什么是数字孪生?它的思想诞生得比较早,但近几年以新身份再次出现在我们的视野中。
我们暂且这么定义它:数字孪生是通过数字技术还原物理实体的数字仿真过程,能帮助我们构建非物理原型、模拟特殊工作环境和推演方案等。其中涉及到数据采集、多源数据融合、数据分析、可视化等技术环节,可视化一般作为数字孪生的最后一步,其结果准确性和时效性就显得格外重要。
准确性方面,我们要解决的问题是,如何提高基于 PBR 的渲染真实度、如何提高画面质量、如何有效兼容不同平台等。
时效性方面,我们要解决的问题是,如何提高场景资源更新频率、如何提高业务数据刷新频率、如何提高渲染帧率等。
从智能制造到智慧城市,数字孪生的应用场景越来越大,带给可视化的技术挑战也越来越大。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|