教程 13:立面向导

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

向导入门

立面向导 您可通过此工具创建复杂的 CGA 立面规则模板。 此工具不需要您写入 CGA 代码;代码由 CityEngine 在背景中自动生成。 该向导便于您快速高效地生成复杂的结构。

借助此工具,您可以创建适应任何立面几何的 CGA 规则。

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

灵活的立面模板

借助立面向导,您可以创建大量立面模板以供重复使用,这可能对未来的工程有所帮助。

立面向导

  1. 要创建场景文件,单击文件 > 新建 > CityEngine 场景
  2. 导入位于苏黎世的国家银行大楼的体量模型。 右键单击 NationalBankMassModel.obj 资产文件,然后单击导入

    OBJ 导入程序随即打开。

  3. 取消选择作为静态模型导入选项,然后单击完成

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

    体量模型作为起点显示:

    银行的体量模型
  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 重复,以设置剩余的两个水平重复的分割 11 和 12。
    分割 11 和 12
  3. 单击 X 重复按钮一次以创建 9 个垂直的重复分割。
  4. 选择一个较暗的窗户,然后通过选择选择区域来设置重复区域。
    设置重复区域。
  5. 使用 X 分割Y 分割工具来隔离该窗户。
  6. 在屋顶上,将屋顶窗台装饰物分割开。
    屋顶窗台装饰物分割
  7. 要给当前平面添加更立体的外观,可通过设置每个分割切片的 zAdjust 值来定义偏移。 单击所需形状,然后向左或向右滑动以编辑该值。 您可以根据需要对任意数量的建筑物部分执行此操作。

    使用 zAdjust 功能:

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

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

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

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

高级立面创建

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

立面分析和规则创建

您将使用的原始立面纹理文件为高级立面:

高级立面

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

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

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

  • 绿色 - 单个切片,非重复
  • 蓝色 - 重复切片(x 或 y)
  • 红色 - 嵌套重复切片(可在 x 或 y 方向切片化)
  • 黄色 - 规则对称性(将在规则优化部分中链接)

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

主立面结构

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

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

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

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

使用裁剪图像工具

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

  1. 文件导航器窗口中选择 Tutorial_13_Facade_Wizard__2015_0\Images\facadeFoto.jpg 图像,然后单击形状 > 裁剪图像,或单击文件导航器 > Tutorial_13_Facade_Wizard__2015_0 > 图像,然后右键单击 facadeFoto.jpg 文件并选择裁剪图像

    裁剪图像工具将自动分析图像的透视线,并尝试查找可能的立面区域。

  2. 在左侧窗口中编辑矩形区域,该窗口会自动在右侧更新结果。

    “裁剪图像”对话框

  3. 对裁剪范围满意后,保存文件。

您已了解图像可以在 CityEngine 中进行校正。 这样就无需离开软件进行操作,从而可以进一步简化流程。

单个分割

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

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

    右侧垂直高层部分未分割。 此部分与左侧相同,且本教程的后续部分将使用规则重新关联解决这一部分。 入口左侧的切片也是同样的情况,对此您将从右侧关联其中一个切片。

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

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

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

    通过单击定义分割后立即执行此操作,然后将鼠标悬停在上次分割的区域上并按上箭头或下箭头键。 请注意,浮动分割对应于 CGA 代码中的波形符 (~)。

重复分割

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

用于定义立面重复部分的重复分割

要进一步细化几何,请继续分割剩余的切片,如下例所示,直到将每个窗户完全分割完成。 将窗户类型分割为它们的组件。

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

底层是一种特殊情况,其中包含一个弧。 请在弧的两侧进行精确分割,以便在本教程的下一部分插入资产。

分割底层切片

设置区域宽度

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

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

优化规则

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

  1. 创建一个规则,将其命名为 MassModel.cga,然后在 CGA 编辑器窗口中将其打开。
  2. 创建一个属性,将其命名为 buildingHeight,并将其值设置为 25
  3. 要导入刚刚创建的立面模板文件,请在 CGA 编辑器窗口中右键单击,从快捷菜单中选择导入规则,然后选择立面模板的 CGA 规则文件。 或者,从文件导航器窗口中拖动 CGA 文件。
  4. 创建一个包含拉伸命令的名为 Lot 的规则。 使用先前生成的 buildingHeight 属性值作为拉伸值。
  5. 拉伸后,添加一个用于分离所有侧面的组件分割。
  6. 分配您导入的立面模板文件的 Facade 规则。 在您的示例文件中,此为 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. 将右侧部分的立面规则替换为左侧部分的立面规则。 在本例中,将 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. 现在,请对入口附近的黄色部分执行相同的操作,并将最左侧的切片替换为入口右侧的切片。

再次生成后即出现最终模型:

最终模型

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

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

相同立面向导规则模板的三个默认 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. 为其他三个资产添加类似的规则。
    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_1Facade__1_5_3 规则。
    NIL 命令用于移除纹理设置为透明的几何。

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

生成的立面

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

四个 LOD 建筑物

此示例中的面计数(仅立面)为 4、1288、6616 和 9654。