Part1前言
在进行建筑可视化项目的时候,我们往往会遇到需要查看建筑每一层楼里面的信息的需求,这时候我们就需要对建筑模型进行分层处理,从而到查看每层楼里的信息以及楼层之间相互切换的要求。如果出现场景里面楼层比较多的情况,我们也不可能针对每栋楼的模型都进行一些重复的处理,这样大大降低效率,所以我们想着去开发一些小工具,设定一些规则,让我们能经过简单的配置就能达到分层的效果。
Part2实现思路
Revit 进行建模,在3DMAX进行模型分组(因为Revit里面很多命名都是系统自定义的,无法修改,这样导入UE中无法满足我们的要求), 然后导出Datasmith后再导入UE5渲染场景以及使用蓝图进行工具逻辑处理。
Part3命令规则
这里我们把每一栋楼分了3个组,层次结构如下:
|------ 楼的名字(组) (根据自己的命名来)
|------ 楼层(组) (命名:1F,2F ... 顶层使用TopF)
|------ 固定的模型的组(组) (命名:Static)
|------ 具体的模型(StaticMesh)(命名: 根据模型的用途自定义命名即可)
|------ 参与后续业务逻辑模型的组(组)(Logic)
|------ 具体的模型(StaticMesh)(命名:根据用途自定义命名)
Part4建模和分组(Revit, 3DMax)
把建好的模型导入3DMax中,按照命名规则进行相应的分组和命名,层级如下图:

然后导出Datasmith。
注意:这里导出Datasmith文件的时候,文件命名需命名成楼的
名字。等导入UE就能发现这样做的好处了。例如我这里使用 JS 命名
Part5UE实现
模型导入UE后大纲中的展示,如下图:

1、Datasmith文件导入UE后,组和模型都会是一个Actor, 组是DatasmithActor, 具体模型是StaticMeshActor。所以,我们可以通过蓝图首先把这些Actor进行分类存储起来。
2、针对楼写一个公共的楼层分层蓝图类(BP_LayerBuilding),每栋楼关联一个该类,主要功能有:
a. 存储当前楼的Actor引用
b. 把楼层用一个map存储里面,key = 楼层 , value = 楼层对应的Actor的引用。
c. 把楼里面的具体模型存储在Map里面, key = 楼层_Static(Logic).具体模型在大纲中的显示名 , value= 具体模型对应的Actor的引用。
d. 为这栋楼里面的所有的组和模型的Actor 进行tag(标签)设置,他们的tag都是在上面存储的map的key前面加上一个当前楼的命名_ ,这样方便我们通过蓝图节点去寻找到我们需要的Actor进行操作。代表楼的组的Actor
tag 命名样例,拿上面UE大纲的图作为范例:
1F的tag = JS_1F
Logic的tag = JS_1F_Logic
Door1的tag = JS_1F_Logic_Door1
3、写一个管理的蓝图类(BP_BuildingLayManager), 用它来管理场景里面的所有楼的分层类。
Part6示例代码
BP_LayerBuilding




BP_BuildingLayManager


Part7使用流程
在UE中导入3栋楼,3栋楼可以是一样的,如下:

在场景中分别给栋楼拖入一个 BP_LayerBuilding蓝图,再拖入一个 BP_BuildingLayManager蓝图。大纲如图:

这里的分层蓝图类我自定义命名了,为了方便知道是管理的哪一栋楼 3. 然后选中大纲里面的一个 BP_LayerBuilding类,然后查看它的细节面板,会有如下界面:

先选择Building Actor , Lowest Floor, ConstTag 如果没有特别要求可以默认,然后点击“解析大楼楼层信息”按钮,就会在 Building Floors , Floor Attached Groups 和 Floor Attached Static Meshs 这三项中看到当前楼层的楼层信息。4. 然后我们运行程序后,就可以点击选中楼,然后对它进行楼层的一些分层效果展示了。我这里的楼层分层效果比较简单,只是做了隐藏显示处理。





Part8总结
本文主要介绍了基于UE5的楼层分层技术的实现方式。
Part9关于IN VETA
IN VETA是一支由建模、美术、UE5组成的年轻团队。

我们的开源项目:
https://github.com/inveta
我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。