查看: 8|回复: 0

虚幻引擎中基于Cesium与建筑矢量数据的动态模型生成

[复制链接]

1

主题

0

回帖

5

积分

版主

积分
5
发表于 2 小时前 |天津| 显示全部楼层 |阅读模式
大家好,今天分享一个在虚幻引擎中,利用 Cesium 插件和建筑矢量数据(GeoJSON)实现动态模型生成的技术方案。这个方案的核心是解决如何高效、准确地将 GIS 数据转化为游戏内可交互的 3D 建筑。
整个流程由一个核心的 ABuildingsGenerationManager 类来驱动,它像一个大管家,协调从数据读取到模型上屏的每一个环节。
🗺️ 第一步:数据加载与坐标转换

一切始于一份 GeoJSON 文件。系统会读取文件中的 features,从中提取两个关键信息:
  • 几何信息 (Geometry):建筑的轮廓坐标,通常是 Polygon 或 MultiPolygon 格式。
  • 属性信息 (Properties):建筑的元数据,比如高度 (Height)、侧面材质ID (MatID_Side)、屋顶类型 (RoofType) 等。
拿到经纬度坐标后,最关键的一步是调用 Cesium 插件提供的 ACesiumGeoreference 组件,通过 TransformLongitudeLatitudeHeightPositionToUnreal 函数,将地理坐标(WGS84)精准地转换为虚幻世界中的笛卡尔坐标。这确保了建筑能“严丝合缝”地落在数字地球的正确位置上。
⚙️ 第二步:性能优化策略

为了应对城市中成千上万的建筑,避免一次性处理导致游戏卡死,方案采用了两个核心优化策略:
  • 多线程处理:耗时的文件读取、JSON 解析和网格数据构建都被放到了后台线程(Async(EAsyncExecution::ThreadPool, ...))中执行。这保证了游戏主线程的流畅,玩家不会感到任何卡顿。
  • 数据批处理 (Batching):系统不会一次性生成所有建筑。它会根据预设的数量(DatesNum),将所有建筑数据分割成多个批次。然后逐批进行网格构建和渲染,实现了建筑的渐进式加载,有效管理了内存和性能开销。
🏗️ 第三步:异步网格构建与渲染

这是最核心的部分,在后台线程中完成:
  • 几何体生成:系统会遍历每个批次的建筑数据,并分别调用 ASidesGeneration、AFoundationGeneration 和 ARoofGeneration 等辅助类,根据建筑轮廓和高度生成墙体、地基和屋顶的顶点(Vertices)与索引(Indices)。
  • 材质匹配:通过一个外部的材质映射 JSON 文件,系统能将 GeoJSON 中的材质ID与项目中实际的 UMaterialInstance 关联起来。在构建网格时,会根据不同的材质ID创建多个渲染 Section,实现一栋建筑拥有多种材质的效果。
  • 碰撞体创建:为了让生成的建筑具备物理属性,代码利用 Chaos 物理系统,根据生成的顶点和索引数据,为每个建筑创建了精确的三角网格碰撞体(Chaos::FTriangleMeshImplicitObject),并将其添加到 UBodySetup 中。
当后台的网格构建完成后,会通过 AsyncTask(ENamedThreads::GameThread, ...) 切回游戏主线程,将生成好的 UStaticMesh 赋给 UStaticMeshComponent,并设置其可见性、阴影和碰撞属性,最终将建筑模型呈现在玩家眼前。
✨ 方案亮点

  • 高效流畅:多线程 + 批处理的组合拳,确保了大规模城市场景生成的流畅性。
  • 精准地理配准:深度集成 Cesium,保证了模型地理位置的绝对准确。
  • 功能完整:从数据解析、材质映射到物理碰撞,提供了一套完整的解决方案。
  • 可扩展性强:代码结构清晰,通过委托(Delegate)暴露了生成进度和完成事件,方便与其他系统(如UI进度条)集成。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:business@nimbusaether.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部