原文地址:https://knowledge.safe.com/articles/904/writing-citygml-example.html
介绍
本文旨在通过引导您使用3D城市模型进行扩展练习来概述FME的3D功能。
在此示例中,我们将使用城市的Autodesk 3DS模型为屋顶和墙壁添加单独的纹理,从而实现更逼真的查看。我们会将此模型写成3D PDF以供查看。
说明
1.读取Autodesk 3ds源数据
Interopolis 3D模型是一个简单的Autodesk 3DS模型,位于市中心的一小部分。
选择interopolis.3ds作为源数据集。在“参数”窗口中,确保“移动到世界坐标系”设置为“是”。这将使FME能读取.wld和.prj文件并将我们的城市模型移动到得克萨斯州机场。
在FME Data Inspector中查看的源3DS模型。
2.分解单网格
这个模型有一个要素,包含单个网格中的每个建筑物,我们需要将建筑物分离到他们自己的要素中,这样我们就可以为每个建筑物提供最终CityGML的ID。添加Deaggregator转换器以分解网格中的聚合体。
3.计算建筑物
使用counter转换器将计数输出属性设置为'BuildingID'。这将为每栋建筑物提供一个身份证号码。在我们可以应用纹理之前,我们需要进一步分解我们的要素,ID号将帮助我们以后将它们重新组合在一起。
4.将建筑物转换为多面几何图形
使用GeometryCoercer转换器将几何类型设置为'fme_composite_surface'。网格几何体由单个表面组成,不能满足我们的需求,因为我们的屋顶和墙壁具有单独的纹理。我们可以使用GeometryCoercer将我们的建筑物转换为多面几何体,其中包含聚合成单个要素的多个面。
5.分解多面
现在建筑物由多个面组成,我们可以将打散聚合后的多面分解为单独的要素,并为建筑物的不同部分设置不同的外观。
确保将“分离复合体”和“打散实例”设置为“ Yes”以从每个复合实体创建单个实体。
此步骤对于下一步非常重要,以便我们可以通过PlanarityFilter中的Planar端口过滤要素。对于要为平面的要素,几何必须使其所有点都位于同一平面上,因此我们需要分离复合体及打散实例来创建这些平面。
6.将屋顶与墙壁分开
接下来,我们需要将屋顶与墙壁分开,以便为它们应用单独的纹理。我们可以利用PlanarityFilter 计算表面法线,然后TestFilter 过滤掉屋顶以及基于这些表面法线的墙壁。
6.1计算表面法线
在PlanarityFilter中,选择“表面法线输出”并将“暴露表面法线”设置为Yes。这将暴露我们需要过滤的Z(_surfaceNormalZ)的曲面法线属性,以便在下一步中区分屋顶曲面和墙壁。幸运的是,这个社区没有屋顶!
6.2过滤掉屋顶和墙壁
接下来在TestFilter转换器中,我们将使用曲面法线来确定面是墙还是屋顶。通常,墙的_surfaceNormalZ应为0,屋顶的_surfaceNormalZ为1,地面的_surfaceNormalZ为-1。然而,由于我们没有建筑物的基面(它们就像开放的倒置盒子),我们希望所有不是墙壁的东西都是屋顶。所以我们将使用下表中的参数:
测试条件 | 输出端口 | |
If | _surfaceNormalZ> 1e-5 | Roof |
Else | <All Other Conditions> |
|
在输入测试条件时,对于Left Value,您可以使用向下箭头,并选择属性值:'_ beforeurNormalZ'。
输出端口的测试条件:Roof。
7.使用两个JPEG文件添加两个纹理
7.1为屋顶添加JPEG文件:
现在我们需要将纹理带入工作区。选择三个屋顶纹理中的一个作为源数据集,并将第一个JPEG读模块添加到工作区。
7.2为墙添加JPEG文件:
对于第二个JPEG读模块,我们想要引入墙面纹理。从源数据中选择墙纹理的三个图像之一。
8.将纹理添加到墙壁和屋顶
我们将使用两个AppearanceSetter转换器分别为屋顶和墙壁添加外观或栅格纹理。
将屋顶纹理(JPEG屋顶要素类型)连接到AppearanceSetter的APPEARANCE端口,将TestFilter的ROOF端口连接到AppearanceSetter的GEOMETRY端口。换句话说,屋顶的AppearanceSetter是由屋顶的几何形状和屋顶纹理的外观决定的。
对墙壁做同样的事情。将JPEG墙要素类型连接到Appearance端口,将TestFilter的Wall端口连接到AppearanceSetter的Geometry端口。
像这样在屋顶和墙壁上添加纹理。
9.聚合要素
现在我们已经将外观应用到每个表面,我们希望将表面合并在一起,以便我们再次为每个建筑物提供单个要素。我们将使用Aggregator转换器执行此操作,并将“分组”设置为“BuidlingID”。
10.将几何类型设置为复合曲面以加快处理速度
使用GeometryCoercer,将“几何类型”设置为“fme_composite_surface”。我们目前有一个多面几何体,很容易在fme中使用,因为我们可以将它分解成可以操作的单个面,但是它可能有点慢,特别是在写入某些格式时。通过将几何类型更改为composite_surface,我们让3D编写者知道他们可以在单个事务中处理每个多面,而不是在单独的事务中处理每个表面。
11.写出3D PDF
添加3D PDF读模块并设置输出位置和文件名,然后运行转换。如果您希望多次运行转换,请记住在运行期间关闭PDF输出。
完成的工作区
结果
恭喜!您已成功转换了Interopolis的3DS城市模型,添加了单独的屋顶和墙壁纹理,并编写了3D PDF。
这是一个可能的输出,使用3D PDF中的屋顶纹理3和墙纹理1。
这是一个不同的墙壁纹理(纹理3)在3D PDF中的特写。