要访问 ArcGIS CityEngine 中的教程,请单击帮助 > 下载教程和示例。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。
本教程旨在为 CGA 代码编写者提供如何为模型添加控点的指导。 控点提供了一种在“3D 视口”窗口内编辑 CGA 属性的方法。 此方法简化了编辑模型,并提供了关于属性所控制内容的视觉提示。
第 1 部分:基础线性控点
它们是使用 CGA 中的属性注记生成的,用于提供一套动态编辑工具。 它们允许您在“视口”窗口中直接、精确地操控模型尺寸和位置。 在本部分中,您将首先创建线性句柄。
- 在导航窗口中展开 Tutorial_18_Handles 教程文件夹。
- 双击 scenes 文件夹中的 part 1.cej 文件以在视口窗口中打开场景。
- 当系统询问您“是否要重新生成这些模型?”时,请单击是。
- 选择立方体模型,并在检查器窗口中试验高度、宽度、深度和偏移量等属性,以理解其行为。
- 双击 rules/cube.cga 规则文件,在 CGA 编辑器窗口中打开它。
其中,控点注记被注释掉了。
#@Handle(shape=Cube) attr height = 10 #@Handle(shape=Cube, axis=x, skin=sphere, color="#6666ff") attr width = 10 #@Handle(shape=Cube, axis=z, skin=diameterArrow) attr depth = 10 #@Handle(shape=ShapeForHandleOnly axis=x reference=origin slip=inside translate={0,0.5,0}) attr offsetX = 5 Lot --> [ s(offsetX,height,1) ShapeForHandleOnly ] t(offsetX,0,0) t(0,0,-depth/2) s(width,0,depth) extrude(height) Cube Cube --> color("#E5E6E7") ShapeForHandleOnly --> NIL
创建高度控点
接下来,您将为立方体的高度创建一个控点。
- 为高度属性添加注记,然后单击文件 > 保存,保存规则:
@Handle(shape=Cube) attr height = 10
此操作会添加一个控点,该控点控制立方体模型的高度。 控点会附加到 CGA 规则的范围中。 在这个第一个示例中,选择 Cube 规则是因为其范围与生成的立方体模型几何一致。
- 选择立方体模型,然后单击生成模型工具
(Ctrl+G),重新生成并显示控点。
现在,可以通过单击并拖动控点的蓝色箭头来编辑属性的值。 在拖动控点时,将显示属性的值。
注:
控点位于模型外部;在旋转视图时,控点随即移动以使其不会遮挡模型。 - 放大。
控点将无法再保持其在模型外部的位置,而是放置在模型上。
创建宽度控点
接下来,您将为立方体的宽度创建第二个控点。
- 为宽度属性添加注记,然后按 Ctrl+S 保存规则:
@Handle(shape=Cube, axis=x, skin=sphere, color="#6666ff") attr width = 10
此操作将另一个控点附加到同一规则,命名为 Cube,并使用其他参数来定制其位置和外观:
- axis=x - 指定控点的方向应位于在相对于立方体范围的 x 方向上。
- skin=sphere - 将控点尖端从箭头更改为球体。
- color=”#6666ff” - 将控点颜色从默认的蓝色更改为紫色。
- 按 Ctrl+G 再次生成模型,并观察新控点。
- 将鼠标指针悬停在控点上。
CityEngine 会同时高亮显示视口窗口中的相关范围以及检查器窗口中的属性。
指定深度控点
接下来,创建第三个控点,用于控制立方体的深度。
- 为此属性添加此注记,然后保存并重新生成:
@Handle(shape=Cube, axis=z, skin=diameterArrow) attr depth = 10
同样,设置 axis 参数,指定控点应位于哪一个范围轴上。 模型 depth 属性的行为与 width 或 height 属性的行为不同。 它将围绕中心点对立方体的深度进行缩放。 考虑到这种情况,请使用参数 skin=diameterArrow。 由此将创建一个具有不同拖动行为的控点和两个蓝色箭头,这两个箭头都可以用于更改立方体模型的深度。
- 旋转视图。
当视图旋转时,控点会避免与模型本身以及它们彼此之间发生渲染冲突。
创建偏移控点
对于最后一个参数 offsetX,您将创建一个当视图更改时不会移动的控点。
- 将以下控点注记添加到 offsetX 以及一个专用的占位符范围:
@Handle(shape=ShapeForHandleOnly, axis=x, reference=origin, slip=inside) attr offsetX = 5 Lot --> [ s(offsetX,height,1) ShapeForHandleOnly ] t(offsetX,0,0) t(0,0,-depth/2) s(width,0,depth) extrude(height) Cube Cube --> color("#E5E6E7") ShapeForHandleOnly --> NIL
此控点附加到一个名为 ShapeForHandleOnly 的空占位符范围,该范围仅为此控点创建而生成,并且不产生任何几何。
- 要可视化形状范围,请打开模型等级窗口并选择 ShapeForHandleOnly。
slip=inside 控点参数请求控点位于模型轮廓内部,并且不会随视点移动。 通常,控点可能会出现在给定轴方向上范围的任何四条边上;但是,reference=origin 会导致控点仅出现在与范围原点相邻的边上。
- 编辑此新控点,使其与立方体的中心接触:
@Handle(shape=ShapeForHandleOnly, axis=x, reference=origin, slip=inside, translate={0,0.5,0}) attr offsetX = 5
translate=parameter 将相对于当前范围来移动控点。 参数 {0,0.5,0} 可沿 y 方向(向上)将控点移动范围 y 比例(高度)的 0.5 倍。
如果不使用 translate= parameter,则 offsetX 控点将位于地面(左侧);如果使用 translate= 参数,则控点将位于立方体的中心(右侧)。 虽然前三个控点位于轮廓外部,但 slip=inside 允许此控点始终位于不可见立方体轮廓内部。
当您将鼠标悬停在控点上时,名为 shape 的规则范围会以蓝色高亮显示。
第 2 部分:高级线性控点
欢迎您进入下一阶段的学习。 现在您将接触到一个更复杂的风车模型。
创建基础风车控点
在本教程的第 1 部分中,您向立方体形状添加了控点。 当您移动视点时,控点会吸附到与立方体面相同的平面上。 您可以对圆柱形风车对象执行相同的操作。
- 打开 part 2.cej 场景。
探索场景中的不同属性。
- 打开 rules/windmill.cga 规则文件。
请注意这些属性如何控制一系列要素,包括圆柱形和重复性元素。 您将在此处深入探讨将控点集成到这些独特几何中的方法。
- 添加注记,创建基本控点并定义属性值的范围。
@Handle(shape=UnderRoof) @Range(min=3, max=100) attr height = 7
在旋转视图时,您将注意到该控点不是非常有效。 当视图旋转时,它将在 UnderRoof 范围拐角处的位置之间跳转。 由于范围比建筑物大并且形状与建筑物不同,因此难以遵循模型与控点之间的关联。
- 修改基本控点并禁用范围限制。
@Handle(shape=UnderRoof, reference=center, slip=screen) @Range(min=3, max=100, restricted=false) attr height = 7
现在,参数 reference=center 可将控点附加到范围的中心(有关其他可用参考位置的详细信息,请参阅 CGA 参考)。 参数 slip= 将定义控点在模型外部移动的方向。 在此情况下,slip=screen 指定它平行于相机的 2D 屏幕移动。 由此产生的控点运动将更加平滑和清晰。
添加半径控点
您可以继续在屏幕的顶部和底部添加两个控点,用于控制风车的半径。
- 添加注记以创建半径控点:
@Handle(shape=UnderRoof, reference=radial, align=bottomLeft) @Range(min=1.5, max=9) attr bottomRadius = 2 @Handle(shape=UnderRoof, reference=radial, align=topLeft) @Range(min=1.0, max=5.1) attr topRadius = 1
- 旋转视图。
在围绕模型旋转视图时,您可以注意到两个新控点针对模型的几何进行了相应移动。 参数 reference=radial 用于放置控点以测量圆柱的半径;align= gives 用于为“视口”窗口上的控点提供首选位置。 使用 align 可确保每个控点具有一致的屏幕视口位置。 否则,bottomRadius 控点可能会显示在模型顶部。
创建链控点
在许多模型中,单个属性将影响多个部分。 在此风车示例中,bladeLength 属性可更改四个叶片中每个叶片的长度。
CityEngine 可将这些控点链接在一起,并针对每个属性显示单个链。
- 向 bladeLength 属性添加控点注记:
@Handle(shape=Blade, axis=x, reference=origin) attr bladeLength = height * 0.6
根据视图方向,可能会显示不同的控点链。 在本示例中,CityEngine 将针对风车叶片显示一个由两个控点组成的链:
- 可以使用 repeat=none 参数关闭链行为。
@Handle(shape=Blade, axis=x, reference=origin, repeat=none) attr bladeLength = height * 0.6
为门和窗口添加控点
windowScale 属性更加复杂,用于控制窗口和门的大小。
注:
单个规则 Windoor 可同时创建窗口和门。- 可以创建用于控制 windowScale 属性的控点。
@Handle(shape=Windoor, axis=y) @Range(min=0.1, max=1.5) attr windowScale = 1
提示:
编辑 height 属性将显示不同数量的窗口。
另一个关于 windowScale 属性的观察结果是缩放因子的值与窗口的大小不同。 此外,每个窗口或门都具有与其相关联的不同大小的范围。 CityEngine 将在重复元素上方放置控点链,并缩放每个控点的长度以匹配每个范围。 拖动此类线性控点(其值与控点的长度不同)将在括号中显示实际长度。
- 将鼠标悬停在控点上方,直到高亮显示其所附加的范围为止。
对于所有控点类型,都会发生此行为。 在此,Windoor 范围以蓝色显示。
- 从不同的视图方向探索控点放置。
第 3 部分:其他类型的控点
在本教程最后的工作流中,您将查看颜色、切换和旋转控点,并将通过移除范围来隐藏控点。
向模型添加范围
在使用不熟悉的 CGA 代码时,使用模型等级窗口来探索可用范围通常非常有用。
- 打开 part 3.cej 场景
- 在场景中生成模型。
- 打开 rules/biped.cga 规则文件。
import leftArm : "limb.cga" import rightArm : "limb.cga" import leftLeg : "limb.cga" import rightLeg : "limb.cga" @Handle(type=linear, axis=x, reference=origin, translate={0, 0.5,0.5},shape=HeadHandle^1, skin=diameterArrow) attr boneSize = 0.16 @Handle(type=linear, shape=Mass, align=left) attr height = 1.85 @Color attr color = "#888888" attr showLimbHandles = false Lot --> t (-boneSize*2.15,0,0) s (boneSize*4.3, 0, boneSize ) extrude(height) Mass Mass --> split (y) { ~4 : Body | boneSize*2 : Head } Head --> t (scope.sx/2-boneSize , 0, scope.sz/2-boneSize ) s (boneSize*2, boneSize*2, boneSize*2) HeadHandle("sphere.obj") HeadHandle(mesh) --> i (mesh) X # (…)
- 单击窗口 > ,打开模型等级窗口。
- 单击检查模型工具,打开形状树。
- 单击模型头部以显示模型等级中的范围。
- 导航等级以定位具有唯一名称的相应范围。
在此处,HeadHandle 似乎是放置控点的合适范围。 将控点附加到 X 将是不理想的,因为它在该 CGA 规则的多个地方被使用。
- 将鼠标指针悬停在模型等级窗口中的 HeadHandle 上。
它显示该规则有一个输入参数 one,其当前值为 sphere.obj。
创建颜色控点
现在,您将为在上一部分中确定的 HeadHandle 范围添加一个颜色控点。
- 为名为颜色的属性添加以下注记:
@Handle(type=color, shape=HeadHandle^1, axis=y, reference=center) @Color attr color = "#888888"
对于 shape=HeadHandle^1,将使用范围的规则名称和该规则采用的参数数量来标识该范围。 在之前的示例中,您已经能够排除该参数数目标识符,因为它为零。 颜色属性为字符串,通过使用参数 type=color,可以在“视口”窗口中对其进行编辑。 颜色、切换和选择器控点的行为与线性控点不同:axis=y 用于指定控点可能沿 y(向上)方向移动,而 reference=center 用于将控点附加到范围中心的单个点。
- 生成模型。
现在它已经包含一个颜色控点,显示为一个三角形。 如果您将鼠标悬停在此新控点上,会出现一个颜色轮,可用于编辑颜色属性。
在三角形内部单击并拖动会改变颜色的饱和度和亮度,而按住单击并围绕大圆拖动则会改变色相。 先前选择的颜色会以更小的圆圈显示在外边缘。
控制控点可见性
可以通过控制其关联范围在规则中的生成来隐藏控点。 将由单个已导入规则实例来创建该模型的每条手臂和腿部。 每个已导入实例都具有 3 个用于控制肢体位置的参数。 然而,这 12 个控点会为模型增加大量视觉混乱。 因此,需要将这些控点附加到仅当布尔属性 (showLimbHandles) 为 true 时才会创建的可选范围。
- 将控点附加到可选范围。
@Handle(type=toggle, shape=HeadHandle^1, slip=screen, align=right) attr showLimbHandles = false
控点类型切换是为布尔属性提供的,显示为方形开关。 这次,将使用 slip=screen 和 align=right 以将控点放置在球形头部右侧的一致位置。
- 添加控点注记后,按 Ctrl+S 保存,然后按 Ctrl+G 重新生成模型。
- 通过单击切换控点,或者通过单击并上下拖动,可以控制切换控点。
使用控点将 showLimbHandles 设置为 true。 当激活时,将为每个肢体显示旋转控点。 这些控点可用于根据需要为人物模型摆姿势。
默认情况下,旋转控点不会随着视图方向的更改而移动。 然而,从侧面看它们是不可见的。 要使用某个控点,旋转相机围绕模型通常可以提供更好的控制。 您可以看到所有定位在模型上的控点,以及通过使用此方法编辑模型而受影响的属性。 请探索控点的所有可能性以及如何将它们应用到您的模型中。