如何快速生成全球任意路网?51WORLD工程师为你揭晓
近日,51WORLD高级工程师彭博在Unreal Fest Shanghai 2024大会上进行了以“克隆地球之路”为主题的分享。以下是演讲文稿整理。

本次分享的主题地球克隆之路有两层含义,第一层,表达我们公司正走在克隆地球的路上。第二层,借此重点分享51WORLD在地球克隆之路上,有关道路要素的数据定义、实时生成、实时编辑和动态车流的一些思考和实践。

51WORLD高级工程师彭博
▍数据定义
为了实现克隆整个地球的核心愿景,在数据设计上我们定了三个目标:
1.兼容全球最大的开源地图数据库OpenStreetMap的道路数据
2.支持路口独立编辑
3.支持车道级编辑

▍实时生成
数据准备好之后我们开始进入实时生成环节,实时生成的起点源自AesEarthActor。创建后,它会进行数据读取和初始化各种系统。其中最主要的就是初始化MarkerSystem和LodSystem。
MarkerSystem是一个异步生成系统,可以实时异步处理海量的相互依赖数据(Marker),生成整个可渲染的地球。
LodSystem基于四叉树调度,通过MarkerSystem处理相互依赖的Marker数据,以满足RoadPayload的需求。
由依赖关系形成的依赖图大致可分为读取数据与转换数据、执行生成、提交生成结果三个部分。
我们提供了两种解决方案来优化提交的性能和渲染的性能。第一个是InstancedSplineMesh解决方案,其目标是让实例化静态网格体也能产生样条线变形,并支持Nanite。

▍实时编辑
在代码实现上,线的编辑可分为三个方面:数据表达,拾取检测和可视化。
Way为编辑器内的道路和路口的数据结构。EntityArray为选中范围内的可编辑数据的集合。每个EntityArray都会进行八叉树的构建,用于点和线的拾取检测。渲染数据时,则用UE自带的UPointSetComponent渲染点的集合,用UAesEditorLineSetComponent渲染线的集合。

为了简化玩家编辑道路时陷入无穷无尽的参数配置的困局中,我们提供了不同道路类型的Prefab用于绘制或替换已绘制的道路。
编辑时还伴随着生成结果的预览。预览生成的实现依托于程序化资产系统中的资产创作工具。预览时会生成临时对象,通过读取道路矢量数据和Prefab信息生成特殊的预览模型。当最终落笔完成时,会调用编辑器的更新流程去更新生成物。

▍动态车流
路建好了,怎么能不通车呢,所以我们尝试在这套系统上生成动态车流。
在UE4中,我们借助了HoudiniNiagara插件,将寻路网络保存为HoudiniPointCache并在Niagara中采样。在UE5的方案选型时,我们则采用了Mass AI + CitySample工程中的Traffic插件为学习、扩展、维护提供更为完善的保障。
对于不了解Mass Traffic的朋友,我们提供了一些MassTraffic的入门参考,并在此列举Mass Traffic系统的使用流程。
先创建车辆和交叉口的EntityAsset,然后放置并配置MassSpawner,配置TagInfo和LaneProfile,绘制ZoneShapeComponent,再点击Build ZoneGraph构建ZoneGraph,最后运行关卡,虚幻引擎就会自动生成可以动的车流。

方案实践时,我们主要面临4个问题。
第一个问题是Traffic插件在每个引擎版本下都有差异,为了维护方便,我们需要插件能一份代码同时兼容UE5.1-UE5.4。
第二个问题最为致命,Build->Build ZoneGraph是WITH_EDITOR的,我们需要能运行时构建ZoneGraph。为了解决这个问题,我们通过对齐,然后通过路网信息,分别构建路口的Polygon和道路的Spline。接着扩展FZoneGraphBuilder,使其能接收注册,并生成FZoneGraphStorage。最后FZoneGraphStorage种完成注册。
第三个问题在于,在路网封闭的条件下,ZoneGraph才能持续不断地寻路,而现实的路网数据充满断头路,我们需要让断头路也能寻路,所以我们制定了相关规则解决了这个问题。
现在我们来到第四个问题,数据是分地块提交的,寻路无法在不同地块的ZoneGraphData间进行。该问题目前无法解决,只能增加限制,以保证不会发生崩溃。
解决完以上四个问题,整个地球任意地块的寻路网络就能正常构建,车流就能正常生成。


▼
了解更多产品及解决方案
可扫描下方二维码
添加小秘书阿文







版权声明
本文仅作者转发或者创作,不代表旺旺头条立场。
如有侵权请联系站长删除
旺旺头条




发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。