坐标系
3D 坐标系用于描述物体在空间中的位置和方向。 虽然 CityEngine 可以处理多种不同类型的(地理配准)坐标系,但 CGA 建模仅适用于笛卡尔坐标系。 坐标系由其原点以及三个正交轴的方向定义。 虽然一个全球坐标系足以定义几何的每个折点,但是使用相对于彼此定义的坐标系层次结构更加实用。
以放置在街段上的汽车模型为例。 定义车轮相对于汽车以及汽车相对于街道的位置是有意义的。 “汽车”系统的原点和方向由“街道”系统的坐标定义。 由此,两个坐标系彼此相对,并且可以将一个系统的坐标转换为另一个系统的坐标。
处理形状时涉及多个坐标系。 将在由当前形状的范围(范围系统)定义的系统中进行上述所有转换。 还存在与每个形状相关联的枢轴系统,并且每个形状都定义了一个对象坐标系。
在 CGA 中,存在多个相互不同的坐标系:
世界坐标系 | |
| |
对象坐标系 | |
| |
枢轴坐标系 | |
| |
范围坐标系 | |
|
CGA 形状
CGA 形状是 CGA 形状语法的主要组成部分。 形状由定向边界框(范围)中的几何组成。 将相对于枢轴放置范围。
注:
初始形状将用作 CGA 规则的起始 CGA 形状,请参阅形状
形状具有以下组件:
形状符号 | 形状的名称。 用于查找用于生成连续形状的匹配规则。 |
枢轴 | 枢轴描述了形状的坐标系,并由以下项定义:
将相对于初始形状的原点,以对象坐标给定枢轴;请参阅坐标系。 |
范围 | 范围表示相对于枢轴的空间形状的定向边界框,并由三个矢量定义:
|
几何 | 几何包含有关构成形状“类型”的拐角边和面的信息。 几何可以是任何类型的面网格。 此外,有关颜色、材料和纹理(着色器属性)的信息也存储在几何中。 |
参数 | 每个形状可以具有关联的参数列表。 将在创建形状的规则中隐式定义经过排序的参数列表。 支持以下三种参数类型:
|
规则应用
规则的基本思想是将具有特定形状符号的形状替换为大量新形状。 形式上:
PredecessorShape --> Successor
以下是一个简单的示例:
A --> B
在具有符号 A 的特定形状上应用时,以上规则将创建该形状的副本并将其形状符号设置为 B。 现在认为 A 形状已完成,不再对其进行处理。 如果没有匹配符号 B 的规则,则生成过程结束。 生成的结构称为形状树,如下所示:
在以上形状树中,A 为根形状,B 为叶子形状。 叶子非常重要,因为所有叶子的总和表示生成的模型。 内部节点在最终模型中将不可见。
在这个简单的示例中,我们假设设置了形状 A 的几何、范围和枢轴,以使形状在原点代表一个单位立方体;因为 B 是 A 的副本,所以 B 看起来完全一样(请参见上图)。
规则可以具有更加复杂的后继,例如,规则的右侧可以包含多个形状符号和形状操作:
A --> B t(3, 0, 0) C
现在,将从左到右执行此后继。 同样,B 是 A 的相同副本。 然后,将当前形状沿 x 方向平移 3 个单位(即,对 scope.t 进行操作),然后创建一个新形状 C。 形状树现在有两个叶子:
两个叶子 B 和 C 构成最终 3D 模型:
如果针对 C 添加此规则:
C --> D s(2, 0.5, 1.75) E
生成过程将为形状 C 添加两个子形状 D 和 E。 形状 D 是形状 C 的精确副本,但形状 E 的范围具有不同大小(由于 s() 形状操作)。 形状树和关联的模型如下所示:
注:
现在,叶子(B、D、E)不在同一层次上(即距根形状的距离不同),但是它们都是模型的一部分。
另一个形状操作是插入操作 i():
E --> i("cylinder.obj") F
再次开始生成后,形状 E 不再是叶子,而是具有子形状 F。
形状 F 的几何不再是立方体,而是替换为从文件“cylinder.obj”中读取的网格。
注:
形状 F 的大小(即 scope.s 矢量)仍然与形状 E 的大小相同。
最终形状
在以上 E 规则中,F 是所谓的最终形状:由于未定义规则 F,因此将在此点处停止生成。 但是,CGA 编辑器将发出“未定义规则”警告。 可以通过在 F 后添加一个句点,从而明确将 F 标记为最终形状来禁用此警告:
E --> i("cylinder.obj") F.
匿名叶子形状
为了方便起见,可以截断诸如以上 E 规则等规则:
E --> i("cylinder.obj")
在本示例中(即 E 没有子形状),规则解释器将静默插入一个与规则本身具有相同名称的匿名叶子。 应用上述 E 规则后的形状树如下所示: