教程 13b:立面向导 - 高级立面创建

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

高级立面创建

在本教程中,您将分析如何拆分立面以更直观地创建规则模板、导入更详细的立面元素以及编辑 CGA 模板以创建高级立面。 要了解立面创建的基础知识,请参阅教程 13a:立面向导 - 基本立面创建

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

立面分析和规则创建

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

初始立面

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

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

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

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

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

主立面(单个分割、重复分割)和规则对称性

  1. 单击新建 > CityEngine 场景 > 创建新场景并将其命名为 MassModel_Advanced.cej
  2. 打开立面向导窗口。
  3. 单击通过图像新建立面按钮 通过图像新建立面 并导航到 AdvancedFacade.tif 文件。
  4. 将区域宽度设置为 20

    设置区域宽度

使用分割类型创建单个分割

要允许立面增大大小并重复纹理,您需要添加单个分割和重复分割,并将分割定义为绝对分割或浮动分割。 下图所示的分割顺序是为了确保分割类型(绝对和浮动)垂直设置。

剩余顶层分割

  1. 使用 X 分割Y 分割工具将单个分割(显示为蓝色线)添加到立面。 每次分割后,立即将鼠标悬停在新区域上即可看到蓝色高亮。 使用向上和向下箭头键循环并为每个分配分割类型(显示为黄色虚线和实线)。
    1. 使用 Shift 键将新分割捕捉到与先前分割相同的轴上。
    2. 通过将鼠标悬停在区域上并再次按向上或向下箭头键来根据需要更改分割类型。
  2. 设置绝对和浮动分割类型后,您现在可以分割剩余的顶层区域:

    顶层分割

  3. 对底层区域执行相同操作,如下所示:

    底层分割

注:

右侧垂直上层楼面未被故意分割,本教程稍后将使用规则重新关联来解决。

了解分割类型

黄线表示分割类型‎。 将分割类型正确定义为绝对分割或浮动分割非常重要。

绝对 - 区域尺寸不可改变,并且区域只会根据不同大小的立面按比例缩放。 仅当在原始单个分割方向上满足新区域重复所需的精确尺寸时,才会生成设置为绝对的区域重复。 为了确保立面的正确平铺,请将缩放时需要固定值的组件指定为绝对分割。

  • 具有绝对分割类型的 X 分割用高亮显示区域上的水平黄实线表示。

    具有绝对分割类型的 X 分割用水平黄线表示

  • 具有绝对分割类型的 Y 分割用高亮显示区域上的垂直黄实线表示。

    具有绝对分割类型的 Y 分割用垂直黄线表示

浮动 - 区域尺寸可变,可缩放以适应不同大小的立面。 设置为浮动的区域的重复并不取决于原始分割的精确尺寸。 它可以拉伸和缩放以适应原始单个分割方向的立面。 浮动分割也对应于 CGA 代码中的波形符 (~)。

  • 具有浮动分割类型的 X 分割用高亮显示区域上的水平黄虚线表示:

    具有浮动分割类型的 X 分割用水平黄虚线表示

  • 具有浮动分割类型的 Y 分割用高亮显示区域上的垂直黄虚线表示:

    具有浮动分割类型的 Y 分割用垂直黄虚线表示

无分割类型 – 区域尺寸是原始图像导入尺寸的剩余部分。 重新缩放立面将拉伸纹理,而无需在任何一个方向上进行任何动态调整。

  • 未分配任何分割类型用高亮显示的区域上没有线来表示:

    无黄线表示无分割类型

重复分割

以下分割为重复分割,用于定义为了适应任意立面大小,将重复立面的哪些部分。

  1. 使用上一部分中已分配的单个分割和绝对值或浮动值,使用 X 重复工具 X 分割来创建以下垂直分割。

    X 重复工具用于创建上层楼面和底层楼面中的垂直分割

  2. 确保上层楼面窗口能够垂直缩放到不同的立面尺寸,分配了浮动分割类型的窗户需要另一个步骤:
    1. 启用 Y 重复工具 Y 重复
    2. 将鼠标悬停在四个窗口的上方,直到看到由红色重复线框住的横跨顶部的横梁,如下所示。
    3. 悬停时,单击每个窗口横梁一次。

      您不会看到分割线,这是预料之中的。

      Y 重复工具用于为唯一组件创建区域

  3. 为了进一步详细说明几何,将每个蓝色区域分割成唯一组件。 随着进展,这些分割将自动在红色区域重复。 请参阅以下详细图像来帮助指导分割顺序。

    唯一的蓝色组件区域在红色区域中重复出现

    楼层分割为组件

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

    底层楼面窗口分割为组件

  4. 将鼠标悬停在这些区域上,查看重复的窗口如何更新。

设置区域宽度

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

  1. 右键单击窗户分割,然后选择设置区域宽度
  2. 输入合适的大小,例如 1.2 米。

    设置区域宽度高级立面

  3. 使用 Z 校正工具来编辑深度值,从而使立面具有立体外观。 将窗户稍稍向后推动,然后将窗台向前推动。 您也可以向前移动三角形和梯形的装饰物。
  4. 单击保存当前立面的规则和纹理按钮 保存当前立面的规则和纹理,以便创建规则文件。

建议您创建有唯一名称的第二个副本,以防稍后想要将立面生成的 CGA 规则文件恢复到此阶段。

注:

立面向导窗口中单击鼠标右键可以启用立即保存并生成选定形状。 如果启用此功能,您将无法获得保存规则文件窗口来选择和更改文件名以及在立面向导中创建副本。

优化规则

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

  1. 导航器窗口中,右键单击教程项目中的规则文件夹,然后单击新建 > CGA 规则文件
  2. 将此新规则命名为 MassModel.cga 并展开 CGA 编辑器窗口。
  3. 创建一个属性,将其命名为 buildingHeight,并将其值设置为 25
  4. 要导入刚刚创建的立面模板文件 (gen_Facade_AdvancedFacade.cga),请在 CGA 编辑器窗口中右键单击,从快捷菜单中选择并浏览找到添加导入。 或者,将 CGA 文件从导航器窗口拖到 CGA 编辑器窗口也可以看到相同的结果。
  5. 创建一个包含拉伸命令的名为 Lot 的规则。 使用先前生成的 buildingHeight 属性值作为拉伸值。
  6. 拉伸后,添加一个用于分离所有侧面的组件分割。
  7. 分配您导入的立面模板文件的 Facade 规则。 在您的示例文件中,此为 gen_Facade_AdvancedFacade.Facade。 您将获得以下质量模型规则文件:

    import gen_Facade_AdvancedFacade: "gen_Facade_AdvancedFacade.cga"
    
    attr buildingHeight = 25
    
    Lot-->
    	extrude(buildingHeight) 
       comp(f){ side : gen_Facade_AdvancedFacade.Facade }

  8. 单击主菜单中的文件 > 全部保存
  9. 视口窗口中,使用形状创建工具创建 10 x 20 米的覆盖区形状。
  10. MassModel.cga 规则分配到此覆盖区形状并按下 Ctrl+G 生成模型。
  11. 选择模型后,使用变换缩放工具 缩放工具 来改变形状并查看外观的按比例变化。

    系统将直接使用立面模板,且规则将适应新地块的几何和 25 米的预定义拉伸高度。

    立面模板已应用

要查看本教程项目提供的所需结果,请打开 scene 文件夹中的 FacadeWizard_3_Advanced.cej 文件和 rules 文件夹中的 MassModel_Advanced_tutorial_part_1.cga 文件。

注:
此规则导入 gen_AdvancedFacade_tutorial_part_1.cga 规则供您参考。

重新关联规则

在下图中,您可以看到剩下的未预先细化的部分(显示为黄色)。 现在,您将使用 CGA 和模型等级窗口来重新关联立面模板中的特定子规则,以填充黄色区域中的缺失部分。

需要重新关联的区域

  1. 单击窗口 > 模型等级并选择建筑物模型。
  2. 单击模型等级工具栏上的检查模型

    进入检查模型模式后,模型会变得略微透明。

  3. 单击您要替换的形状节点:立面的右侧垂直部分,在上图中使用黄色突出显示。 此操作将在模型等级窗口中选择该形状。

    注:

    使用模型等级窗口中的一组可视化按钮,可以轻松地可视化和隔离立面部分。 当您选择模型等级树的不同组件时,CGA 编辑器窗口会以交互方式高亮显示支持每种组成的规则的重合部分。

    模型等级中的立面

    选择立面的这个垂直部分后,右键单击模型等级窗口,然后选择折叠其他项以通过折叠未选择的形状树部分来简化视图。

    将其他项折叠为简单视图

  4. 选择父形状节点,然后双击该节点。

    模型等级中高亮显示的父形状

    视口窗口中的父节点

    CGA 编辑器窗口中,负责创建此形状节点的 Facade template 规则以高亮显示。 所选规则将创建三个立面部分:左侧、中间和右侧。

    在 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,因此可以将其删除。

    重新关联之前:

    重新关联之前

    重新关联之后:

    重新关联之后

注:

您可能需要刷新场景或重新生成模型才能看到变化。

现在,请对入口附近的黄色部分执行相同的操作,并将最左侧的切片替换为入口右侧的切片 - 如本教程部分开头的图像所示。 结果应该显示较高楼层右侧有较短的窗户,而底层楼层左侧有无遮阳篷的拱形窗户。

再次生成后,显示最终模型:

重新关联之后的立面

要查看本教程项目文件夹提供的所需结果,请打开 scene 文件夹中的 FacadeWizard_4_Advanced.cej 文件和 rules 文件夹中的 MassModel_Advanced_tutorial_part_2.cga 文件。 注意此规则导入 gen_AdvancedFacade_tutorial_part_2.cga 规则供您参考。

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 仅会生成一个被分割的平面并将忽略所有 Z 校正编辑,而 LOD 2 会引入 Z 校正编辑,使用具有纹理的立方体对象生成立体表示。

要创建 LOD 3,您需要插入一些其他资产来添加必要的细节,如下所示:

具有不同 LOD 的立面

这些 LOD 看起来非常相似,但是,当放大时,细节上的差异很明显。 根据体验模型的方式来考虑这一点很重要。 以下示例证明了这一点:

低 LOD (0)

通过图像缩放来提供简单制图表达的 2D 立面制图表达:

低 LOD (0)

中等 - 低 LOD (1)

带分割的 2D 立面制图表达:

中等 - 低 LOD (1)

中等 LOD (2)

标点一般立面组件以提供深度感:

中等 LOD (2)

高 LOD (3)

特定立面组件的细节提供了深度感和建筑风格:

高 LOD (3)

提示:

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

要创建LOD 3,目标是使用模型等级中高亮显示的形状、CGA 中高亮显示的代码以及定制资产的插入组合。

编辑资产

首先,编辑 MassModel.cga 文件。

  1. 添加 LOD 属性并将值设置为 3

    attr LOD = 3
    attr buildingHeight = 25
    
    import gen_Facade_AdvancedFacade:"gen_Facade_AdvancedFacade.cga"
    Lot-->
    	extrude(buildingHeight) 
       comp(f) { side : gen_Facade_AdvancedFacade.Facade }

    在研究了立面的装饰之后,您可以引入以下资产:

    • tympanon.obj
    • triangularPediment.obj
    • squarePediment.obj
    • entryArc.obj

    资产详细信息

  2. 从三角形檐饰资产开始,在 CGA 编辑器窗口中打开 gen_Facade_AdvancedFacade.cga 规则。
  3. 为底部的三角形檐饰资产添加新规则。

    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() 将在资产上叠加立面纹理。

  4. 为其他三个资产添加类似的规则。

    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 编辑器窗口中创建此形状节点的立面模板规则将突出显示。

    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

    资产插入之前,立面显示如下:

    资产插入之前的立面规则

    资产插入之前的模型等级中的立面

  4. 在第二种情况下,在现有规则的末尾,添加 insertTriangularPedimentAsset 规则以触发资产插入。

    资产插入之后,立面显示如下:

    资产插入之前的立面规则

    资产插入之前的模型等级中的立面

  5. 重复步骤以将此资产插入到立面中的其他位置,并对其他资产执行相同的操作以创建 LOD 3。

移除屋顶元素

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

  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 and Facade__1_5_3 规则。

链接所有必要的规则后,更新检查器中的 LOD 属性并尝试使用立面向导创建的所有不同的 LOD。 对于 LOD 3,生成的立面如下所示:

已完成的立面,包含重新关联、资产插入和 LOD3

此示例中的面计数(仅立面)为:

  • LOD 0 = 4
  • LOD 1 = 1288
  • LOD 2 = 6616
  • LOD 3 = 9654

要查看本教程项目文件夹提供的所需结果,请打开 scene 文件夹中的 FacadeWizard_5_Advanced.cej filerules 文件夹中的 MassModel_Advanced_tutorial_part_3.cga。 注意此规则导入 gen_AdvancedFacade_tutorial_part_3.cga 规则供您参考。

检查器窗口中的最终立面

现在,您已经创建了立面规则,可以为各种 3D 建筑物模板分配、更改细节层次并动态缩放。

处理 2D 立面时,您还可以考虑探索裁剪图像工具的图像裁剪和调整大小功能。