坐标系

3D坐标系用于描述物体在空间中的位置和方向。虽然CityEngine可以处理许多不同类型的(地理参考)坐标系,但 CGA 建模仅适用于笛卡尔坐标系。坐标系由其原点和三个正交轴的方向定义。虽然一个全局坐标系足以定义几何的每个顶点,但使用相对于彼此定义的坐标系层次结构更为实用。

想想放置在街道上的汽车模型。定义车轮相对于汽车的位置和汽车相对于街道的位置是有意义的。“汽车”系统的原点和方向由“街道”系统的坐标定义。这样,两个坐标系相互关联,一个系统的坐标可以转换为另一个系统的坐标。

处理形状时涉及多个坐标系。上面描述的所有转换都在由当前形状的范围定义的系统中运行,范围 system。还有一个与每个形状相关联的枢轴系统,每个形状都定义了一个对象坐标系

在 CGA 中有多个不同的坐标系相对于彼此:

世界坐标系

  • 每个场景定义。
  • 世界坐标系是全局的,每个场景只能有一个。
  • 可以进行地理参考,但不是必须的。
  • 初始形状的位置在世界坐标中定义。

 

GUID-D77C4165-24DC-4EEC-A6BF-3825342F1222-web
对象坐标系

  • 为每个初始形状定义的局部坐标系。
  • 原点位于初始形状第一条边的第一个点。
  • 轴的方向为使 x 轴沿第一边指向,y 轴沿第一面的法线指向,z 轴垂直于前两者。

 

GUID-B3CF50F5-9FCD-4E56-9339-8A731CAC80FF-web
枢轴坐标系

  • 枢轴系统在对象坐标中描述。
  • 在许多情况下,枢轴原点和方向与对象坐标相同。它仍然发挥作用,例如组件拆分

 

GUID-9256F050-659D-49E0-AC2A-9DBECF9CA2C3-web
范围坐标系

  • 将范围视为放置在枢轴系统中并定向的边界框。
  • 范围除了具有坐标系的特性外,还具有大小。尺寸由宽度、高度和深度定义。
  • 使用转换,您可以定义范围的位置、方向和大小。

 

GUID-774ADAD0-662E-4E69-8D8B-277FE6109FE7-web
 
笔记:

 

CGA 形状

CGA 形状是 CGA 形状语法的核心成分。Shape 由定向边界框中的几何图形组成,即范围。范围相对于枢轴放置。

GUID-3C20CFD7-1E4C-4695-BE2D-C062DA612D99-web
在枢轴坐标系中应用的范围的平移和大小定义了几何体的位置、大小和方向。
笔记:

初始形状用作 CGA 规则的起始 CGA 形状,请参阅形状

形状具有以下组件:

形状符号

形状的名称。用于查找用于生成连续形状的匹配规则。

枢轴描述了形状的坐标系,定义为:

  • 位置向量 p ( pivot.px , pivot.py pivot.pz )
  • 方向向量 o(pivot.oxpivot.oypivot.oz)

 

枢轴在对象坐标中给出,相对于初始形状的原点;参见 坐标系

范围

范围表示空间中形状相对于枢轴的定向边界框,由三个向量定义:

  • 平移向量 t ( scope.tx , scope.tyscope.tz )
  • 旋转矢量 r ( scope.rx , scope.ryscope.rz )
  • 大小向量 s ( scope.sx , scope.syscope.sz )

几何学

几何包含有关构成形状“形式”的角边和面的信息。几何形状可以是任何类型的多边形网格。此外,有关颜色、材质和纹理(着色器属性)的信息也存储在几何体中。

参数

每个形状都可以有一个关联的参数列表。有序参数列表在创建形状的规则中隐含定义。支持三种参数类型:

  • 布尔值
  • 数字(内部用双精度浮点数表示)
  • 细绳
 

规则应用

规则的基本思想是用一定数量的新形状来替换一个形状符号。正式地:

PredecessorShape –> Successor

这是一个简单的例子:

A –> B

在使用符号 A 应用于特定形状时,上述规则会创建形状的副本并将其形状符号设置为 B。现在认为 A 形状已完成且不再处理。如果没有规则匹配符号B,则生成过程结束。生成的结构称为形状树,如下所示:

GUID-A201882E-CA95-450C-A478-C4C57774D2FF-web
形状树

在上面的形状树中,A 是根形状,B 是叶子形状。叶子非常重要,因为所有叶子的总和代表生成的模型。内部节点在最终模型中不可见。

GUID-BBF5E7A5-14B9-4056-A118-F40BA5642EA6-web
生成的模型

在这个简单的例子中,我们假设形状 A 的几何形状、范围和枢轴设置为使得形状代表原点的单位立方体;因为 B 是 A 的副本,所以 B 看起来完全一样(见上图)。

一个规则可以有更复杂的后继者,例如,规则的右侧可以包含多个形状符号和形状操作:

A –> B t(3, 0, 0) C

这个后继者现在从左到右执行。同样,B 是 A 的相同副本。然后当前形状在 x 方向上平移了 3 个单位(即,操作了scope.t)并创建了一个新形状 C。形状树现在有两片叶子:

GUID-8537D5DF-4C29-47F2-84AB-16443F2F6598-web
在树中创建的形状 C

两片叶子 B 和 C 组成了最终的 3D 模型:

GUID-B5EBAE16-9365-41A5-B569-D79B8962663C-web
叶子 B 和 C 组成最终模型

如果我们为 C 添加这条规则:

C –> D s(2, 0.5, 1.75) E

生成过程将向形状 C 添加两个孩子,D 和 E。形状 D 是形状 C 的精确副本,但形状 E 将具有不同大小的范围(因为s()形状操作)。形状树和相关模型如下所示:

GUID-277E8F49-F7B8-4B9B-8B06-8DD1BBDE357A-web
GUID-F3E2F368-37C6-4240-AC76-12CB4B50256B-web
添加了子 D 和 E 的形状树和模型
笔记:

现在,叶子(B、D、E)不在同一级别(即到根形状的距离不同),但它们都是模型的一部分。

另一个形状操作是插入操作i()

E –> i(“圆柱体.obj”) F

再次开始生成后,形状 E 不再是叶子,而是现在有一个子形状 F。

GUID-9759B12D-B928-489D-9E40-47DB1633DB18-web
形状 E 与子形状 F

形状 F 的几何形状不再是立方体,而是被从文件“圆柱体.obj”中读取的网格替换。

笔记:

形状 F的大小(即scope.s向量)仍然与形状 E 的大小相同。

GUID-74288FD1-8859-45FB-ABBB-A94C1A483996-web
形状 F 与形状 E 大小相同

端子形状

在上面的 E 规则中,F 是所谓的终端形状:因为没有定义规则 F,所以在此点停止生成。但是,CGA 编辑器会发出“未定义规则”警告。这可以通过在 F 之后添加一个句点来抑制,从而明确地将 F 标记为终端形状:

E –> i(“圆柱体.obj”) F.

匿名叶子形状

为方便起见,像上面的 E 规则这样的规则可以被截断:

E –> i(“圆柱体.obj”)

在这种情况下(即 E 没有子节点),规则解释器默默地插入一个与规则本身同名的匿名叶子。应用上述 E 规则后的形状树如下所示:

GUID-1F6BFE5C-57F3-4F55-B4ED-34EB5D6D81F7-web
应用 E 规则后的形状树