要访问 ArcGIS CityEngine 中的教程项目,请打开 CityEngine 并点击 帮助 > 下载教程和示例 在主菜单中。选择教程或示例后,项目将自动下载并添加到您的 CityEngine 工作区。
本教程由Houseal Lavigne Associates的Devin Lavigne合作制作。
CityEngine 是一种“程序化建模应用”,意味着二维形状通过一系列程序(CGA 规则文件)转换成一个3D模型。 CityEngine 的力量在于CGA(计算机生成建筑)。 CityEngine 的CGA是唯一一种可以指定来生成建筑3D内容的编程语言。本质上,当CGA规则被分配或应用于形状时,就会创建3D模型。3D模型的复杂性取决于CGA规则及其内部指令。一个简单的CGA文件可能会将建筑足迹形状拉伸以赋予其3D形式或质量。而更复杂的CGA规则可能会在质量的外墙上应用纹理,或者将其分割成其他部分,生成丰富、详细的3D模型。
编写CGA的关键之一是逐步编写规则并在过程中逐步添加功能。虽然制定期望结果的计划很重要,但你不能编写500行代码然后点击开始。相反,你应该逐步构建规则,并在过程中测试结果。
本教程将指导您创建一条规则,从一个简单的平面图生成一系列3D建筑。
打开场景
首先,打开项目中的BasicsOfRules.cej 场景 场景文件夹:
你好,世界!
在编程中有一个东西叫做“Hello, World!”——一种编写简单代码以输出简单消息的方法,这样你就可以看到基本语法并确认你的代码是否正常工作。在CityEngine中,一个简单的“Hello World!”版本是一个对随机高度进行简单挤压并为形状应用颜色的示例。
所以要创建你的第一个规则,右键点击 \rules\ 文件夹,然后前往 新建 > CGA 规则文件 并将规则命名为 DetailedBuilding.cga.
首先,在声明CityEngine版本的代码行下面添加以下几行,例如版本 20XX.X,然后保存您的规则。
@StartRule
Footprint -->
extrude(rand(10,100))
color(1,1,0)
通过注释@StartRule,这使得Footprint规则可以从选择器中使用。下一行将形状随机拉伸到10到100米的高度。最后,最后一行在RGB中将形状着成黄色。
分配规则
保存规则后,选择图形并分配规则,可以通过直接将CGA规则文件从导航器窗口拖放到选定的图形上,点击 分配 在规则部分的检查器窗口中,或者点击主菜单中的图形>分配规则文件。如果分配了新规则后没有发生任何变化,请点击 生成模型工具 (Ctrl+G) 或点击主菜单中的图形>生成模型。
添加属性
既然你的规则已经生效,将高度作为一个属性添加到规则中,以增加规则的额外功能。请记住,关键在于逐步更改,所以你不是从头开始,而是要修改你已经创建的规则:
@Group("Building Shell")
@Range(min=0, max=100, stepsize=1)
attr building_height = rint(rand(10,100))
@StartRule
Footprint -->
extrude(building_height)
color(1,1,0)
这些更改将随机建筑高度移动到一个名为building_height的属性。这仍然为每个形状生成,但将其移动到您可以在 Inspector窗口中控制的属性。您还添加了一个新的内置函数rint,该函数将随机数四舍五入到最接近的整数。
该@Group注释帮助你组织属性在检查器窗口中的显示位置。该@Range注释控制滑块的功能。通过将建筑高度设置为属性,你现在有一个滑块来控制每个形状的高度。
现在,如果你点击一个建筑,你可以调整高度并覆盖随机数。此外,滑块现在只在0到100之间,即你范围的最小值和最大值。
添加手柄
手柄扩展了你的属性功能,并以一种非常直观和互动的方式将控制带入场景。
添加@Handle 注释和Mass 规则,以包括控制模型中建筑物高度的把手:
@Group("Building Shell")
@Handle(shape=Mass, axis=y)
@Range(min=0, max=100, stepsize=1)
attr building_height = rint(rand(0,100))
@StartRule
Footprint -->
extrude(building_height)
color(1,1,0)
Mass
记得重新生成你的模型 (CTRL+G) – 建筑物上会出现把手,允许你调整高度属性。
添加楼层拆分
继续对你的规则进行增量修改,现在你将添加一些代码,以在每层楼沿着y轴垂直分割建筑物。
创建 质量 规则,并使用由新 floor_height 属性控制的拆分操作。请注意,默认单位是米,因此下面的代码显示3.048米,注释 # 只是告诉你这是10英尺。
@Group("Building Shell")
@Handle(shape=Mass, axis=y)
@Range(min=0, max=100, stepsize=1)
attr building_height = rint(rand(10,100))
@Range(min=1, max=25, stepsize=1)
attr floor_height = 3.048 # 10 feet
@StartRule
Footprint -->
extrude(building_height)
color(1,1,0)
Mass
Mass -->
split(y) { floor_height : Floor }*
你可能会注意到大楼的顶层楼高不同。这是因为分隔从底层开始并向上进行,顶层的楼高是所有分隔完成后剩下的高度。
解决这个问题的一种方法是在楼高前面添加一个波浪号(~)。这告诉CityEngine使用浮动大小,使软件能够自动调整分裂。每层楼的高度不会正好是3.048米,但它们会全部相等,并且不会有剩余部分。
Mass -->
split(y) { ~floor_height : Floor }*
构建一个用于使用的着色函数
首先,您应该注释掉您在@StartRule中分配颜色到脚印的那行代码。尽管在规则之间处理形状时您可以多次更改颜色,但只设置一次颜色是良好的编程习惯。
添加 #color(1,1,0) 注释:
@StartRule
Footprint -->
extrude(building_height)
#color(1,1,0)
Mass
函数是一段可以执行特定过程并返回值的代码块或程序。要根据土地利用情况为你的楼层上色,你可以创建一个简单的函数,该函数可以被调用来使用适当的颜色。为此,你还需要创建属性,以便根据楼层位置选择不同的土地利用类型。
@Group("Building Shell")
@Handle(shape=Mass, axis=y)
@Range(min=0, max=100, stepsize=1)
attr building_height = rint(rand(10,100))
@Range(min=1, max=25, stepsize=1)
attr floor_height = 3.048 # 10 feet
@Group("Land Use")
@Enum("Retail","Office","Multi-Family")
attr use_ground = "Retail"
@Enum("Retail","Office","Multi-Family")
attr use_upper = "Multi-Family"
接下来,在你的属性和@StartRule之间创建一个新的函数。下面的函数接收use参数并评估它以返回外墙的正确颜色。如果use参数不匹配,它会传递颜色 #FFFFFF,即白色。
getColor(use) = case use == "Retail" : "#FF6633"
case use == "Office" : "#6699FF"
case use == "Multi-Family" : "#A97C50"
else: "#FFFFFF"
最后,通过找到底层和上层楼层,然后调用函数为楼层着色,将所有内容组合在一起。为了将顶层与所有上层楼层的分割区分开来,你使用 split.index 和 split.total,这些在你调用分割函数时会被创建。为此,你需要扩展你的代码,添加 Floor 规则。 Floor 规则首先执行一个条件规则 – case。如果 split.index 为 0,则是底层,否则是上层楼层。一旦楼层确定,函数就会被调用并设置楼层颜色。
Floor -->
case split.index == 0:
color(getColor(use_ground))
else:
color(getColor(use_upper))
通过调整高度和土地利用属性,你现在可以实现更多样化的拓扑结构:
创建一个常量
创建常量可以让你创建一个静态数字以进行计算。这在多个用途中都很有帮助,包括在教程的下一部分中涵盖的报告。下面的代码行帮助你从平方米计算平方英尺以及你建筑中的居住单元数量。但要知道,常量可以是任何内容,并且可以放置在代码中的任何位置。不过,将常量集中在一起并放在页面顶部附近是一个好习惯。注意,这些常量将CityEngine默认的公制值(米)转换为美国英制值(英尺)。
const unitScale = 0.3048 # convert meters to feet
const areaScale = 10.7639 # convert square meters to square feet
const acres = 43560 # there are 43,560 square feet in an acre
添加报告
除了生成3D模型,CityEngine 还可以在你的规则中运行和报告计算,以获取有价值的数据。这意味着你不仅可以可视化你的计划或开发,还可以生成数值报告——使CityEngine成为地理设计领域的强大工具。例如,它可以包括诸如毛面积(GFA)、单位数量或土地用途混合等数字。此外,在更改计划,包括模型和形状时,报告会自动更新。
基于你的规则,你将报告一些数据。你最初会很简单,只报告建筑面积。首先通过修改楼层规则来继续扩展到一个名为板的规则。在板规则中,你将几何体分解成组件面(comp(f)),然后将形状的底部传递到 报告规则以计算几何体的面积。请注意,你需要首先分离出底部形状,否则你的计算将包括每个形状的整个表面积。
Floor -->
case split.index == 0:
color(getColor(use_ground))
Plate
else:
color(getColor(use_upper))
Plate
Plate -->
comp(f) { side : Wall | bottom : Reporting | top : Top }
Reporting -->
report("FloorArea", geometry.area)
要查看结果,请保存规则文件 (Ctrl+S),选择所有形状 (Ctrl+A),然后点击 生成模型 (Ctrl+G)。
展开 报告 部分在 检查器 窗口中:
这告诉我们总共有117层,总面积为85,704.20平方米。要将楼层面积转换为平方英尺,只需将geometry.area乘以areaScale常数。
Reporting -->
report("FloorArea", geometry.area * areaScale)
现在,如果你想要通过土地使用来找出某个地区的面积,或者一些重要的和常见的城市规划信息,比如密度或容积率,你可以对你的规则进行一些简单的修改,将土地使用信息作为参数传递。你可以修改代码,将土地使用(use_ground 和 use_upper)作为 landUse 参数传递给 Plate 规则,然后 Plate 规则再将这些信息传递给
Floor -->
case split.index == 0:
color(getColor(use_ground))
Plate (use_ground)
else:
color(getColor(use_upper))
Plate (use_upper)
Plate(landUse) -->
comp(f) { side : Wall | bottom : Reporting(landUse) | top : Top }
Reporting(landUse) -->
report("FloorArea." + landUse, geometry.area * areaScale)
为了计算容积率(FAR),您需要报告或计算地块的面积。要进行此计算,请将报告操作添加到 足迹规则中,作为@StartRule。
@StartRule
Footprint -->
report("LotArea", geometry.area * areaScale)
extrude(building_height)
#color(1,1,0)
Mass
添加仪表板
仪表板是扩展 CityEngine报告的好方法。通过仪表板,您可以提取规则中报告的任何值,如果需要,可以进行额外的计算,并以条形图和图表的形式展示信息。
首先点击 窗口 > 仪表板 在主菜单中。
默认情况下,这将打开 仪表板 选项卡在 检查器 窗口中。
点击添加图表按钮以打开窗口。选择饼图,将土地利用添加到标题框中,并在报告下拉菜单中选择FloorArea.*。最后,点击添加卡片并将其放置在仪表板窗口画布上以添加卡片:
添加另一张卡片。这次选择钥匙编号。命名标题FAR,选择楼面面积.*作为报告,并且你会除以地块面积。点击添加卡片并将其添加到画布上:
最后一步,您可以为图表添加颜色,以匹配屏幕上建筑物的颜色。为此,您需要在报告规则中添加第二行。这将调用土地利用的颜色函数,并将其作为图表的属性添加。
Reporting(landUse) -->
report("FloorArea." + landUse, geometry.area * areaScale)
report("FloorArea." + landUse + "#color", getColor(landUse))
要了解如何使用CityEngine作为设计工具的强大功能,请选择一个建筑并使用操纵杆更改建筑的高度。
仪表板实时更新,帮助城市规划师或设计师制定符合当地要求或设计目标的计划。
在本教程中,您将学习如何执行以下操作:
- 作者编写一条规则,从一个简单的足迹创建一系列3D建筑。
- 在您的规则内运行和报告计算以获得宝贵的数据。
- 创建仪表板,将报告值以图表和图形的形式可视化。
一定要查看其他 Essentials 教程: CityEngine 之旅,使用 Get Map Data 建设城市,和 处理 GIS 数据。
继续使用CityEngine进行学习,请参阅 CityEngine教程目录。
评论(0)