CityEngine

来自Wiki.Citydatum
跳转至: 导航搜索
TODO
提示:该页面仍需进一步完善,欢迎加入我们

CityEngine是一款Esri苏黎世研发中心(原Procedural公司)开发的三维建模软件应用,特别适合于三维城市环境的生成。利用程序化建模(procedural modeling)方法,CityEngine可支持细节丰富、大尺度三维城市模型的创建。

概述

  • 基于规则批量建模编辑:规则定义了一系列的几何和纹理特征决定了模型如何生成。基于规则的建模的思想是定义规则,反复优化设计,以创造更多的细节。当有大量的模型创造和设计时,基于规则建模可以节省大量的时间和成本。最初,它需要更多的时间来写规则文件,但一旦做到这一点,创造更多的模型或不同的设计方案,比传统的手工建模更快。
  • 与ArcGIS集成编辑:CityEngine提升了ArcGIS三维建模能力,充分使用GIS数据快速创建3D内容,为ArcGIS三维数据的获取提供保障,使得ArcGIS三维解决方案更加完善。

应用

  • 城市规划与城市设计
  • 城市研究
  • 电影制作:疯狂动物城、超能陆战队均利用CityEngine来构建大尺度的城市模型;
  • 游戏开发

上手

用户界面

  • 主要窗口类型:导航栏、场景编辑器、CGA规则编辑器、三维视窗、平面图(顶视图的三维视窗)、监视窗口、控制台输出、消息记录

基本流程

  • 新建场景:在创建CityEngine项目之后,可创建新的场景(scene);
  • 创建布局:城市布局(layout)由街道(street)、街坊(block)、地块(lot)构成,最简便的创建城市布局的方法,是使用Graph菜单下的“街道生成向导”(Street Creation Wizard);也可导入由AutoCAD导出的DXF文件、由OpenStreetMap导出的OSM文件来生成街道网络;
操作 数据形式
前期数据准备 地理或控制地图,属性图层(图像)
街道网络创建与编辑 街道网络,graph图形(中线)
基本的地块/街道机和编辑及街块细分 地块与街道,shape形状(二维多义面)
用形状语法进行几何体生成 三维城市,模型(带贴图的三维体块mesh)
后续模型处理 导出标准工业格式的模型文件

常用函数

函数名 功能概述 形式与参数 示例
extrude 拉伸/挤出,把地块变成一个建筑
extrude(height)
extrude(axisWorld, height) 
  • height:拉伸高度,默认沿模型Y轴方向拉伸;
  • axisWorlvalign="top"d:设定世界坐标系的轴作为拉伸轴线(world.x/world.y/world.z)
Lot -->
    extrude(10)
    CompModel
comp 组件拆分/炸开,把模型从整体分成不同的部分
comp(compSelector) { selector1 : operator operations | selector2 : operator operations ... }
  • compSelector:要分割组件的类型,可选值{f:面|e:边|v:点}
  • selector:
    • front, back, left, right, top, bottom 前后左右上下(模型轴系)
    • vertical(垂直), horizontal(水平), aslant(有坡度的), nutant
    • side 除水平部件外的其它部分
    • all 所有的
CompModel-->
    comp(f){side: ColorsSideFacade | top: ColorfTopFacade}
color 着色,给模型着色
color(s)
color(r,g,b)
  • s (string):文本类型的颜色值(16进制)例如:"#rrggbb"
  • r,g,b (float,float,float):浮点类型的颜色值,每个值的取值在0到1.0之间
ColorsSideFacade-->
    color("#00ffff")  SplitModel
ColorfTopFacade-->
    color(1,0,0) TopFacade
split 分割/切片,建筑分成不同的楼层
split(splitAxis) { size1 : operations1 | size2 : operations2 | ... | sizen-1 : operationsn-1 }
  • splitAxis:取值{X | Y| Z},轴系为模型轴系
  • sizen:分割的宽度
SplitModel-->
    split(y){4:color("#aa33bb") GroundFloor. | {~3:Floor.}*}
注:符号“ * ”代表重复执行,“ ~ ”代表一个近似值
i(insert) 插入/替换
i(geometryPath)
  • geometryPath (string):要插入的几何体名称, 应为内置或存放于资源搜索路径里的几何体;
i("example.obj")
t(Scope Translate) 移动
t(x,y,z)
  • x,y,z:在各个轴向上移动的距离;
t(x,y,z)
s(Scope Translate) 缩放
s(x,y,z)
  • x,y,z:在各个轴向上缩放的比例;
s(x,y,z)

CGA规则语法

CGA(computer generated architecture)规则可在整个城市的尺度上,控制大量的几何形、比例、建筑或街道风貌肌理。规则文件由规则、属性、自定义函数以及注释等构成的集合。

  • 形状(Shape):形状是CGA规则语法的核心要素,形状的名字被称为“模型标识”(shape symbol),由几何体构成,并具有被称“范围”(scope)的包围盒(oriented bounding box)。
  • 规则文件:由规则、属性、自定义函数以及注释等构成的集合。

规则

类型 特点 形式 示例
标准规则 与无参函数比较类似,其结果返回给模型标识
PredecessorShape --> Successor
Lot --> extrude(10) CompModel
带参规则 与有参函数比较类似,根据需要传递改变后继模型外观的信息
PredecessorShape(Parameters) --> Successor
Lot --> color(1,0,0) Footprint(20)
Footprint(height) --> extrude(height) Envelope
随机规则 用以随机生成不同外观的模型
PredecessorShape --> 
    percentage%: Successor1 
    percentage%: Successor2
    ...
    else: SuccessorN
Lot -->
    60%:color(1,0,0) Footprint(20)
    30%:color(0,1,0) Footprint(30)
    else:color(0,0,1) Footprint(50)
Footprint(height) --> extrude(height) Envelope
条件规则 与函数中的条件语句比较类似,条件规则的关键字是case、else,根据不同的条件生成不同外观的模型
PredecessorShape --> 
    case condition1: Successor1 
    case condition2: Successor2
    ...
    else: SuccessorN
Lot -->
    case geometry.area<400:color(1,0,0) Footprint(20)
    case geometry.area>1000:color(0,1,0) Footprint(30)
    else:color(0,0,1) Footprint(50)
Footprint(height) --> extrude(height) Envelope
递归规则 与函数中的循环语句比较类似,适用于满足一定条件时重复执行相同的操作
PredecessorShape --> 
    case condition1: Operations PredecessorShape 
    case condition2: Successor2
    ...
    else: SuccessorN
Lot -->
    extrude(10)
    color(1,0,0)
    comp(f){side:SideFacade | top:Recursive}	
Recursive -->
    case geometry.area > 100:
        X s('0.8,'0.8,'1)
        extrude(3) center(xz)
        comp(f){side:SideFacade|top:Recursive}
    else: X

属性

属性是一组静态的全局变量,每个属性被初始化一个特定的值。

  • attr(变量):可在inspector面板里调整,与对象的属性字段做关联;当定义的属性名字与字段名一致时会自动关联(值类型一致)
  • Const(常量):参数值不能在inspector面板里调整,也不能在规则中利用set函数调整其值。
const height=20 
Lot -->
    color(1,0,0)
    extrude(height)

自定义函数

在CityEngnie中的自定义函数与属性比较类似,前面无关键字。自定义函数可以被参数化、随机化和条件化。

attr Floor=0 
height=
    case Floor < 2 : 5
    case Floor < 6 : 4 + 3.2 * ( Floor - 1 )
    else : 3.8 + 3 * ( Floor - 1 ) 
Lot -->
    color(1,0,0)
    extrude(height)

注释

注释是为了提高规则的易读性,为团队合作与后续修改提供参考;

注释类型 形式 示例
行注释 利用字符“//”或“#”注释一行
// a comment
# another comment
块注释 利用“/*……*/”可以实现块注释
/* block comments
 can be used to write
 multi-line comments
*/
行内注释 行内注释也是通过“/*……*/”来实现的
Lot -->
    Garden House /*Garage*/ Fence

参考链接