教程 13:立面向导

要访问 CityEngine 中的教程,请单击帮助 > 下载教程和示例...。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。

第 1 部分:简介和基本示例

立面向导是一种简单易用的工具,可帮助用户创建复杂的 CGA 立面规则模板。 该工具最大的优点是,用户无需编写任何实际的 CGA 代码,而是由 CityEngine 在后台自动生成该代码。 可以非常高效且轻松地生成非常复杂的结构。

该过程的优点在于可以创建 CGA 规则,以适应任何给定的立面几何。

在下图中,我们将看到示例立面图片以及将规则文件分配给不同大小的建筑物立面后所生成的模型。 请注意,窗户的数量会根据立面大小进行调整。

灵活的立面模板

通过立面向导,您可以轻松创建可随时重用的大型立面模板池 - 该功能十分受欢迎,对于即将进行的工程则尤其如此!

立面向导

  1. 创建新的场景文件文件 > 新建 > CityEngine 场景
  2. 首先,我们导入位于苏黎世的国家银行大楼的质量模型。 为此,请用鼠标右键单击资产文件 NationalBankMassModel.obj,然后单击导入
  3. OBJ 导入程序随即打开。 取消选择作为静态模型导入选项,然后单击完成

    现在,该建筑物应在场景原点附近处于可见状态。

    质量模型作为起点:

    银行的质量模型
  4. 通过双击来选择较短的侧立面形状。
  5. 单击形状 > 分离面以分离模型的面。
  6. 窗口 > 显示立面向导下打开立面向导
  7. 单击立面向导中的通过图像新建立面按钮通过图像新建立面,然后打开 assets 文件夹中的 Plane_MG_3_TX.jpg
  8. 单击确定以使用默认区域宽度。

底层分割

接下来,您将使用分割工具裁剪出立面的特定区域。

  1. 验证是否已选择 Y 分割按钮 Y 分割,并创建水平分割 1 和 2,以将主要建筑物质量大致划分为底层、高层和屋顶部分。
    分割 1 和 2
  2. 接下来,创建底层区域;包括两个左侧窗户、入口和两个右侧窗户。
    1. 选择 X 分割按钮 X 分割
    2. 借助 X 分割蓝色线,单击底层左侧以创建分割 3 和 4,以分离两个(重复的)左侧窗户。
    3. 继续创建垂直分割,然后单击条目右侧以创建分割 5
    4. 最后,单击底层上的最右侧以创建分割 6,并定义两个(重复的)右侧窗户。
      分割 3 到 6
    提示:

    为了加快选择正确分割类型的过程,您还可以使用左右箭头键在各个分割类型之间循环!

    注:
    设置分割后,您可以返回分割线并以交互方式编辑其位置以优化位置。

  3. 单击 X 重复按钮 X 重复将分割类型更改为重复分割。
    1. 创建红色的重复分割 7 和 8
    2. 在重复分割中,蓝色区域即为重复区域。 在此示例中,请选择光线不透过窗户显示的区域。 右键单击该区域并选择“选择区域”。 对右侧(重复)窗户重复相同的步骤。
    具有重复分割的底层

高层分割

  1. 要针对高层创建分割 9 和 10,请单击垂直分割按钮垂直分割,然后按 SHIFT 键以捕捉到在底层级别创建的分割 3 和 6
  2. 在高层区域内部单击一次 Y 重复按钮 Y 重复,以设置剩余的 2 个水平重复的分割 11 和 12
    分割 11 和 12
  3. 单击 X 重复按钮一次以创建 9 个垂直重复分割。
  4. 选择一个较暗的窗户,然后通过选择选择区域来设置重复区域
    设置重复区域
  5. 使用 X 分割Y 分割工具来隔离该窗户。
  6. 在屋顶部分上,将屋顶窗台装饰物分割开。
    屋顶窗台装饰物分割
  7. 要为目前为止的平面添加体积更大的外观,可通过设置每个分割切片的 zAdjust 值来定义偏移。 只需单击所需形状,然后在按住鼠标左键的同时向左或向右滑动即可编辑该值。 您可以根据需要在建筑物任意数量的部分上执行此操作。

    使用 zAdjust 功能:

    zAdjust 功能
  8. 单击保存当前立面的规则和纹理按钮保存当前立面的规则和纹理,以便为立面生成 .cga 文件。
  9. 单击视窗选项卡,然后将规则分配给立面形状。
  10. 选择形状并生成该形状,以查看体积立面。
  11. 单击显示隐藏形状按钮以隐藏原始形状。

    可见性设置中,单击显示/隐藏形状 (F11) 显示/隐藏形状以隐藏原始形状:

    具有最终立面规则的原始质量模型面
    注:

    要正确查看体积立面,您必须取消选择显示/隐藏形状 (F11) 按钮。 相反,当您要选择其他立面时,必须再次将其激活。

第 2 部分:高级立面创建

简介

在此示例中,我们会将图像文件加载到立面向导中,以创建一个立面规则模板。 随后,我们将创建一个简单的质量模型构建规则,并触发先前生成的立面规则。

立面分析和规则创建

我们将使用的原始立面纹理文件将是“高级立面”:

高级立面

用户在使用立面向导来创建更为复杂的立面时,经常会遇到一系列的困难。

在大多数情况下,使用立面向导时,有必要仔细研究一下立面的详细信息(例如窗户分格的数量、装饰细节的重复或楼层高度不均匀等情况),以找到分割结构的最佳方法。 请务必花几分钟时间从策略角度考虑一下这个问题!

在以下方案中,您将看到一种可行的主立面细分创建方法。

  • 绿色: 单个切片,非重复
  • 蓝色:重复切片 [x 或 y]
  • 红色:嵌套重复切片 [在 x 和 y 中可切片化]
  • 黄色:规则对称性 [将在规则优化部分中链接。]

主立面结构:单个分割、重复分割和规则对称性的分析:

主立面结构

与上一个示例不同,我们将直接从选择纹理文件开始。

  1. 窗口 > 显示立面向导下打开立面向导
  2. 单击通过图像新建立面按钮通过图像新建立面并导航到文件 AdvancedFacade.tif

    系统随即弹出一个名为设置区域宽度的小窗口,您可以在其中输入立面的总宽度,从而使分割尺寸也具有几何意义。 请注意,此值可在流程中稍后的环节进行编辑。 通常而言,您无法知道立面的确切尺寸,但您知道窗户具有特定的大小。 在这种情况下,您仅需在达到此单个窗户的范围时输入相应值即可。

  3. 请将该值暂时设置为 20,我们稍后将再次进行设置。
    “设置区域宽度”对话框

EXCURSUS START:裁剪图像工具

您将很有可能使用倾斜的立面照片,并且没有任何主线正确处于垂直或水平状态。 在这些情况下,可以使用裁剪图像工具来创建正交纹理。

  1. 文件导航器中选择 Tutorial_13_Facade_Wizard__2015_0\Images\facadeFoto.jpg 图像,然后单击形状 > 裁剪图像,或选择文件导航器 > Tutorial_13_Facade_Wizard__2015_0 > 图像,然后右键单击 facadeFoto.jpg 并选择裁剪图像
  2. 启动裁剪图像工具后,该工具将自动分析图像的透视线,并尝试查找可能的“立面”区域。

  3. 在左侧窗口中编辑矩形区域,该窗口会自动在右侧更新结果。 对所裁剪的范围感到满意后,请保存文件。
“裁剪图像”对话框

EXCURSUS END:--> 我们已经知道可以在 CityEngine 中对图像进行校正。 这样我们就不必离开软件进行操作,从而可以进一步简化流程。

单个分割

要允许立面增大大小并重复纹理,您需要添加单个分割和重复分割,并将分割定义为绝对分割或浮动分割。

  1. 使用 X 分割Y 分割工具将单个分割添加到立面。
    单个分割的第一个序列
    注:

    右侧垂直高层部分将保持在无分割的状态。 该部分与左侧相同,且本教程中稍后将使用规则重新关联对其进行求解。 入口左侧的切片也会出现相同的状况,此时我们将从右侧关联其中一个切片。

  2. 将第二和第四高层的垂直大小定义为绝对大小。

    在第一个分割系列中,我们必须将分割类型正确定义为绝对分割或浮动分割,这十分重要。 我们希望立面之后能够进行切片,因此必须将需要绝对值的部分定义为绝对分割。 要定义分割是绝对距离还是浮动距离,请使用上箭头和下箭头键在各个类型之间循环。

    • 绝对:黄色线
    • 浮动:黄色虚线

    在通过单击定义分割并将鼠标悬停在上一分割的区域上方并单击上箭头或下箭头键后,即可立即执行此操作。 请注意,浮动分割与 CGA 代码中的波形符 '~' 符号相对应。

重复分割

以下分割为重复分割,用于定义为了适应一切立面大小,将重复立面的哪些部分。 首先将分割 2、4、6 和 7 定义为具有一个切片大小的水平分割;这样当建筑物变高时,这些楼层将会重复出现。 不要忘记设置余下的两个水平重复分割(每个分割为 4 个水平切片)。

“重复”分割,用于定义系统将重复立面的哪些部分

要进一步详细描述几何,请如接下来的方案中所示,将剩余的每个切片进一步分割,直到将每个窗户完全分解为止。 将窗户类型分割为它们的组件。

将窗户类型分割为它们的组件

存在弧的底层属于一种特殊情况。 请在弧的两侧对底层进行分割,以便我们可以在本教程接下来的第 3 部分中插入资产。

分割底层切片

设置区域宽度

在这里,我们将通过定义一个单扇窗户的宽度来重新定义总立面大小。 在本教程部分的开头,我们已经在设置区域宽度弹出窗口中定义了完整立面大小。 但由于我们不确定该值是否正确,并且通常来说,我们对窗户的大小要比对完整的立面更加熟悉,因此我们需要设置一个新值。

  1. 右键单击窗户分割,然后选择设置区域宽度...,然后
  2. 输入合适的大小,例如 1.2 米。
  3. 使用 zAdjust 来编辑深度值,从而使立面具有体积外观。 将窗户稍稍向后推动,然后将窗台向前推动。 此外,可根据需要向前移动三角形和梯形的装饰物。
  4. 单击保存当前立面的规则和纹理按钮保存当前立面的规则和纹理,以便创建规则文件。 此外,建议您创建第二个副本,以防您稍后要将脚本文件恢复到此阶段。

规则优化

您现在可能会问:我们应如何继续执行这一规则? 由于立面向导中的规则文件是为立面构造的,我们只能将其分配给垂直表面。 因此,我们需要创建一个简单的质量模型规则,并根据该规则对其进行测试。

  1. 创建一个名为 MassModel.cga 的新规则,然后在 CGA 编辑器中将其打开。
  2. 创建一个名为 buildingHeight 的属性,其值为 25
  3. 导入刚刚创建的立面模板文件,方法是在 CGA 编辑器中单击鼠标右键打开快捷菜单,选择导入规则...,然后选择立面模板 CGA 规则文件。 (或者,可从文件导航器中拖放 CGA 文件)。
  4. 使用拉伸命令创建一个名为 Lot 的新规则。 使用先前生成的 buildingHeight 属性值作为拉伸值。
  5. 拉伸后,请添加一个将分离所有“侧”面的组件分割。
  6. 分配我们导入的立面模板文件的立面规则。 在我们的示例中,该文件为 gen_Facade_AdvancedFacade.Facade。 您将获得以下质量模型规则文件:
    import gen_Facade_AdvancedFacade : "gen_Facade_AdvancedFacade_dist.cga"
    attr buildingHeight = 25
    
    Lot-->
    	extrude(buildingHeight) comp(f) { side : gen_Facade_AdvancedFacade.Facade }
  7. 使用 Lot 初始规则创建一个覆盖区形状,然后将其分配给 MassModel.cga 规则并生成模型。 您会看到系统将直接使用立面模板,且该规则将根据新地块的几何和 25 [米] 的预定义拉伸高度进行调整。
    自定义 MassModel 规则以及在所有侧面上触发立面模板

重新关联规则

在下图中,我们将看到剩下的未预先进行进一步详细说明的部分(已用黄色标记)。 现在,我们将使用 CGA 和模型等级窗口来重新关联立面模板中的特定子规则,以填充黄色标记区域中的缺失部分。

黄色区域将显示缺少详细信息的位置

  1. 单击窗口 > 显示模型等级,然后选择建筑物模型。
  2. 激活位于模型等级工具条上的检查模型。 进入检查模型模式后,模型会变得略微透明。
  3. 单击您要替换的形状节点:立面的右侧垂直部分,在上图中标记为黄色。 该操作将在模型等级视图中选择该形状。
    已选择部分立面的模型等级视图

    模型等级视图窗口中单击右键,然后选择图形 > 折叠其他项,以通过折叠形状树的未选择部分来整理模型等级视图中的视图。

  4. 选择父形状节点,然后双击该节点。 该操作将高亮显示负责在 CGA 编辑器中创建此形状节点的“立面”模板规则。
    已选择的父形状节点
  5. CGA 编辑器中的所选规则将负责创建 3 个立面部分:左侧、中间和右侧部分。 将右侧部分的立面规则替换为左侧部分的立面规则。 在本例中,我们需要将 Facade__1_3_3 替换为 Facade__1_3_1

    原始:

    Facade__1_3 -->
    	split(x, noAdjust) { 2.68: Facade__1_3_1 | ~10.62: Facade__1_3_2 | 2.66: Facade__1_3_3 }

    修改时间:

    Facade__1_3 -->
    	split(x, noAdjust) { 2.68: Facade__1_3_1 | ~10.62: Facade__1_3_2 | 2.66: Facade__1_3_1 }

    现在,立面的右侧部分将使用与左侧部分相同的规则。 现在已不再需要未使用的规则 Facade__1_3_3,因此可以将其删除。

    重新关联之前:

    重新关联之前

    重新关联之后:

    重新关联之后
  6. 现在,请对入口附近的黄色部分执行相同的操作,并将最左侧的切片替换为入口右侧的切片。

您已经完成了本教程的第 2 部分,并在再次生成最终模型后即可使用最终模型:

最终模型

第 3 部分:LOD 和资产插入

简介

在完成立面向导中立面模板的基本创建之后,我们需要跳出固有的思维模式,探索如何使用 CGA 和模型等级来提升默认立面向导规则的质量。

在“立面向导教程”的最后一部分中,我们将介绍以下两个主题:

  • 细节层次 (LOD)
  • 在立面模板中插入资产

细节层次

创建 3D 城市的过程中可能会生成大型数据集,这些数据集通常只能在高度注意资源的情况下进行处理,因此高级用户有时会希望依靠为同一建筑物创建复杂程度不同的多个模型。 例如,如果某个建筑物可以在照相机前方直接看到,则其所有细节都应处于可见状态,而对于远离照相机(甚至可能看不到)的建筑物,应尽可能减少其显示细节,但仍需保证可以识别其基本形态。 这种用于创建相同对象的不同模型并根据与照相机之间的距离来使用这些模型的技巧在计算机图形学领域广为人知,人们通常以术语细节层次 (LOD) 来指代这一技巧。

如果查看一下由立面向导创建的规则文件,您会发现一个默认的 LOD 系统已经实施。 CGA 文件(可在 CGA 脚本编辑器中查看)的顶部包含了对各个默认值的说明。

请注意,CityEngine 可以创建不同的 LOD,但尚未实施可直接基于照相机接近程度切换模型的系统。

attr LOD = 2
# LOD 0 generates the original texture
# LOD 1 generates flat splits
# LOD 2 generates splits with depth as defined in Facade Wizard

下图显示了全部 3 个预定义 LOD 的应用,这些 LOD 是基于本教程上一部分中创建的规则进行显示的。 请注意,LOD 1 和 LOD 2 之间的差异虽小但很明显:LOD 1 仅会生成一个被分割并将忽略所有 zAdjust 编辑的平面,而 LOD 2 实际上会生成具有纹理立方对象并结合 zAdjusts 的体表示。

显示相同立面向导规则模板的 3 个默认 LOD:

相同立面向导规则模板的 LOD
提示:

非常重要的一点是要了解,如果将立面向导规则模板导入到其他 CGA 规则中(例如像教程最后部分中的 MassModel.cga 文件那样),则还必须在主 CGA 文件中初始化 LOD 属性 -> attr LOD = 2

随之出现了一个重要的问题:如果可使用立面向导创建的模板细节不够丰富(即使在 LOD 2 中也是如此),我们该怎么办? 我们可以创建 LOD 3 吗?

答案是:完全可以!

此问题的解决方案是将模型等级中的形状高亮显示、CGA 中的代码高亮显示以及定制资产的插入巧妙地结合在一起。

编辑资产

首先,我们需要编辑 MassModels.cga 文件。

  • 将先前引入的属性 LOD 更改为值 3。

在研究了立面的装饰之后,我们决定引入以下资产:

  • tympanon.obj
  • triangularPediment.obj
  • squarePediment.obj
  • entryArc.obj
立面装饰

从三角形檐饰资产开始,在 CGA 编辑器中打开立面规则。

  1. 为底部的三角形檐饰资产添加新规则。
    insertTriangularPedimentAsset --> 
    	case LOD ==3 : Shape
            t(0, 0, '1)
            s('1, '1, 0.25) 
            i("triangularPediment.obj") 
            projectUV(0) Asset
    	else : Shape

    对于 LOD 3,我们将加载 obj 资产;t() 和 s() 将正确放置和缩放资产;projectUV() 将在资产上叠加立面纹理。

  2. 为其他 3 个资产添加类似的规则。
    insertSquarePedimentAsset --> 
    	case LOD ==3 : 
    		Shape
    		t(0, 0, '1) s('1, '1, 0.25) i("squarePediment.obj") 
    		projectUV(0) Asset
    	else : Shape		
    
    insertArcEntryAsset --> 
    	case LOD ==3 : 
    		t(0, 0, -0.35) s('1, '1, 0.5) i("entryArc.obj")
    		projectUV(0) Asset
    	else : Shape
    
    addTympanonAsset --> 
    	case LOD ==3 : 
    		t(0, 0, '1) i("tympanon.obj") 
    		projectUV(0) Asset
    	else : Shape
    注:

    资产 entryArc.objtympanon.obj替换现有形状的几何,而资产 triangularPediment.objsquarePediment.obj 将被置于现有形状的顶部。 规则中的主要代码差异就是规则中的第一个“形状”。

资产插入

接下来要做的就是找到正确的最终形状;我们可以通过这些形状关联到新规则并插入资产,如下图中所示。

  1. 选择建筑物并进入检查模型模式。
  2. 选择要在其中插入资产的形状。
  3. 模型等级视图中,双击所选的形状。 该操作将高亮显示负责在 CGA 编辑器中创建此形状节点的立面模板规则。
  4. 在第二种情况下,在现有规则的末尾,添加 insertTriangularPedimentAsset 规则以触发资产插入。
    Facade__1_3_1_2_2_2 -->
    	case LOD <= 1:
    		setupProjection(0, scope.xy, '8.0953, '19.2869, '-0.1945, '-11.3296)
    		projectUV(0) 
    	else:
    		setupProjection(0, scope.xy, '8.0953, '19.2869, '-0.1945, '-11.3296)
    		t(0, 0, -0.2) 
    		s('1, '1, 0.2) 
    		i("builtin:cube") 
    		projectUV(0) insertTriangularPedimentAsset

资产插入之前:

资产插入之前

资产插入之后:

资产插入之后

执行相同的步骤,将此资产插入到立面中的其他位置,并对其他资产执行相同的操作。

移除屋顶元素

最后一步是移除屋顶上的外部元素。

  1. 使用检查模型模式查找规则,然后将外部分割部分替换为 NIL。
    Facade__1_5 -->
    	split(x, noAdjust) { 2.68: NIL | ~10.62: Facade__1_5_2 | 2.66: NIL }
  2. 删除未使用的 Facade__1_5_1 和 Facade__1_5_3 规则。
    NIL 命令可用于删除纹理变为透明的几何

当您关联了所有必要的规则后,所生成的立面将如下所示:

生成的立面

此最终图片显示了彼此相邻的全部四个 LOD:

四个 LOD 建筑物

此示例中的面计数(仅立面)为:4、1288、6616、9654。 太棒了。