在3D城市模型中添加不同的纹理

原文地址:https://knowledge.safe.com/articles/904/writing-citygml-example.html

介绍

本文旨在通过引导您使用3D城市模型进行扩展练习来概述FME3D功能。

在此示例中,我们将使用城市的Autodesk 3DS模型为屋顶和墙壁添加单独的纹理,从而实现更逼真的查看。我们会将此模型写成3D PDF以供查看。

说明

1.读取Autodesk 3ds源数据

Interopolis 3D模型是一个简单的Autodesk 3DS模型,位于市中心的一小部分。

选择interopolis.3ds作为源数据集。在参数窗口中,确保移动到世界坐标系设置为。这将使FME能读取.wld.prj文件并将我们的城市模型移动到得克萨斯州机场。

https://knowledge.safe.com/storage/attachments/18495-3ds-source.png

FME Data Inspector中查看的源3DS模型。

2.分解单网格

这个模型有一个要素,包含单个网格中的每个建筑物,我们需要将建筑物分离到他们自己的要素中,这样我们就可以为每个建筑物提供最终CityGMLID。添加Deaggregator转换器以分解网格中的聚合体。

3.计算建筑物

使用counter转换器将计数输出属性设置为'BuildingID'。这将为每栋建筑物提供一个身份证号码。在我们可以应用纹理之前,我们需要进一步分解我们的要素,ID号将帮助我们以后将它们重新组合在一起。

4.将建筑物转换为多面几何图形

使用GeometryCoercer转换器将几何类型设置为'fme_composite_surface'。网格几何体由单个表面组成,不能满足我们的需求,因为我们的屋顶和墙壁具有单独的纹理。我们可以使用GeometryCoercer将我们的建筑物转换为多面几何体,其中包含聚合成单个要素的多个面。

5.分解多面

现在建筑物由多个面组成,我们可以将打散聚合后的多面分解为单独的要素,并为建筑物的不同部分设置不同的外观。

确保将分离复合体打散实例设置“ Yes”以从每个复合实体创建单个实体。

https://knowledge.safe.com/storage/attachments/18497-deaggregator-params.png

此步骤对于下一步非常重要,以便我们可以通过PlanarityFilter中的Planar端口过滤要素。对于要为平面的要素,几何必须使其所有点都位于同一平面上,因此我们需要分离复合体及打散实例来创建这些平面。

6.将屋顶与墙壁分开

接下来,我们需要将屋顶与墙壁分开,以便为它们应用单独的纹理。我们可以利用PlanarityFilter 计算表面法线,然后TestFilter 过滤掉屋顶以及基于这些表面法线的墙壁。

6.1计算表面法线

PlanarityFilter中,选择表面法线输出并将暴露表面法线设置Yes。这将暴露我们需要过滤的Z_surfaceNormalZ)的曲面法线属性,以便在下一步中区分屋顶曲面和墙壁。幸运的是,这个社区没有屋顶!

6.2过滤掉屋顶和墙壁

接下来在TestFilter转换器中,我们将使用曲面法线来确定面是墙还是屋顶。通常,墙的_​​surfaceNormalZ应为0,屋顶的_surfaceNormalZ1,地面的_surfaceNormalZ-1。然而,由于我们没有建筑物的基面(它们就像开放的倒置盒子),我们希望所有不是墙壁的东西都是屋顶。所以我们将使用下表中的参数:

 

测试条件

输出端口

If

_surfaceNormalZ> 1e-5 
_surfaceNormalZ <-1e-5

Roof

Else

<All Other Conditions>


Wall

https://knowledge.safe.com/storage/attachments/18498-surface-normal-attribute.png

在输入测试条件时,对于Left Value,您可以使用向下箭头,并选择属性值:'_ beforeurNormalZ'

 

https://knowledge.safe.com/storage/attachments/18500-test-conditions-testfilter.png

输出端口的测试条件:Roof

 

7.使用两个JPEG文件添加两个纹理

7.1为屋顶添加JPEG文件:

现在我们需要将纹理带入工作区。选择三个屋顶纹理中的一个作为源数据集,并将第一个JPEG读模块添加到工作区。

7.2为墙添加JPEG文件:

对于第二个JPEG读模块,我们想要引入墙面纹理。从源数据中选择墙纹理的三个图像之一。

8.将纹理添加到墙壁和屋顶

我们将使用两个AppearanceSetter转换器分别为屋顶和墙壁添加外观或栅格纹理。

将屋顶纹理(JPEG屋顶要素类型)连接到AppearanceSetterAPPEARANCE端口,将TestFilterROOF端口连接到AppearanceSetterGEOMETRY端口。换句话说,屋顶的AppearanceSetter是由屋顶的几何形状和屋顶纹理的外观决定的。

对墙壁做同样的事情。将JPEG墙要素类型连接到Appearance端口,将TestFilterWall端口连接到AppearanceSetterGeometry端口。

https://knowledge.safe.com/storage/attachments/18501-appearance-setter.png

像这样在屋顶和墙壁上添加纹理。

 

9.聚合要素

现在我们已经将外观应用到每个表面,我们希望将表面合并在一起,以便我们再次为每个建筑物提供单个要素。我们将使用Aggregator转换器执行此操作,并将分组设置“BuidlingID”

10.将几何类型设置为复合曲面以加快处理速度

使用GeometryCoercer,将几何类型设置“fme_composite_surface”。我们目前有一个多面几何体,很容易在fme中使用,因为我们可以将它分解成可以操作的单个面,但是它可能有点慢,特别是在写入某些格式时。通过将几何类型更改为composite_surface,我们让3D编写者知道他们可以在单个事务中处理每个多面,而不是在单独的事务中处理每个表面。

11.写出3D PDF

添加3D PDF读模块并设置输出位置和文件名,然后运行转换。如果您希望多次运行转换,请记住在运行期间关闭PDF输出。

完成的工作区

https://knowledge.safe.com/storage/attachments/18504-completed-workspace.png

结果

恭喜!您已成功转换了Interopolis3DS城市模型,添加了单独的屋顶和墙壁纹理,并编写了3D PDF

https://knowledge.safe.com/storage/attachments/18505-result-2.png

这是一个可能的输出,使用3D PDF中的屋顶纹理3和墙纹理1

https://knowledge.safe.com/storage/attachments/18506-result-1.png

这是一个不同的墙壁纹理(纹理3)在3D PDF中的特写。

 

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/87780883
今日推荐