教程 18:控点

要访问 ArcGIS CityEngine 中的教程,请单击帮助 > 下载教程和示例。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。

带导航点的控点

本教程旨在为 CGA 代码编写者提供如何为模型添加控点的指导。 控点提供了一种在“3D 视口”窗口内编辑 CGA 属性的方法。 此方法简化了编辑模型,并提供了关于属性所控制内容的视觉提示。

第 1 部分:基础线性控点

它们是使用 CGA 中的属性注记生成的,用于提供一套动态编辑工具。 它们允许您在“视口”窗口中直接、精确地操控模型尺寸和位置。 在本部分中,您将首先创建线性句柄。

  1. 导航窗口中展开 Tutorial_18_Handles 教程文件夹。
  2. 双击 scenes 文件夹中的 part 1.cej 文件以在视口窗口中打开场景。
  3. 当系统询问您“是否要重新生成这些模型?”时,请单击
  4. 选择立方体模型,并在检查器窗口中试验高度、宽度、深度和偏移量等属性,以理解其行为。
  5. 双击 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

创建高度控点

接下来,您将为立方体的高度创建一个控点。

  1. 为高度属性添加注记,然后单击文件 > 保存,保存规则:

    @Handle(shape=Cube)
    attr height = 10

    此操作会添加一个控点,该控点控制立方体模型的高度。 控点会附加到 CGA 规则的范围中。 在这个第一个示例中,选择 Cube 规则是因为其范围与生成的立方体模型几何一致。

  2. 选择立方体模型,然后单击生成模型工具 生成 (Ctrl+G),重新生成并显示控点。

    现在,可以通过单击并拖动控点的蓝色箭头来编辑属性的值。 在拖动控点时,将显示属性的值。

    带有高度控点的模型

    注:
    控点位于模型外部;在旋转视图时,控点随即移动以使其不会遮挡模型。

  3. 放大。

    控点将无法再保持其在模型外部的位置,而是放置在模型上。

    高度控点(放大视图)

创建宽度控点

接下来,您将为立方体的宽度创建第二个控点。

  1. 为宽度属性添加注记,然后按 Ctrl+S 保存规则:

    @Handle(shape=Cube, axis=x, skin=sphere, color="#6666ff")
    attr width = 10

    此操作将另一个控点附加到同一规则,命名为 Cube,并使用其他参数来定制其位置和外观:

    • axis=x - 指定控点的方向应位于在相对于立方体范围的 x 方向上。
    • skin=sphere - 将控点尖端从箭头更改为球体。
    • color=”#6666ff” - 将控点颜色从默认的蓝色更改为紫色。
  2. Ctrl+G 再次生成模型,并观察新控点。

    带有多个控点的模型

  3. 将鼠标指针悬停在控点上。

    CityEngine 会同时高亮显示视口窗口中的相关范围以及检查器窗口中的属性。

    控点和检查器显示(悬停时)

指定深度控点

接下来,创建第三个控点,用于控制立方体的深度。

  1. 为此属性添加此注记,然后保存并重新生成:

    @Handle(shape=Cube, axis=z, skin=diameterArrow)
    attr depth = 10

    同样,设置 axis 参数,指定控点应位于哪一个范围轴上。 模型 depth 属性的行为与 widthheight 属性的行为不同。 它将围绕中心点对立方体的深度进行缩放。 考虑到这种情况,请使用参数 skin=diameterArrow。 由此将创建一个具有不同拖动行为的控点和两个蓝色箭头,这两个箭头都可以用于更改立方体模型的深度。

    带有多个控点的模型

  2. 旋转视图。

    当视图旋转时,控点会避免与模型本身以及它们彼此之间发生渲染冲突。

创建偏移控点

对于最后一个参数 offsetX,您将创建一个当视图更改时不会移动的控点。

  1. 将以下控点注记添加到 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 的空占位符范围,该范围仅为此控点创建而生成,并且不产生任何几何。

  2. 要可视化形状范围,请打开模型等级窗口并选择 ShapeForHandleOnly

    移动范围

    slip=inside 控点参数请求控点位于模型轮廓内部,并且不会随视点移动。 通常,控点可能会出现在给定轴方向上范围的任何四条边上;但是,reference=origin 会导致控点仅出现在与范围原点相邻的边上。

  3. 编辑此新控点,使其与立方体的中心接触:

    @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 部分中,您向立方体形状添加了控点。 当您移动视点时,控点会吸附到与立方体面相同的平面上。 您可以对圆柱形风车对象执行相同的操作。

  1. 打开 part 2.cej 场景。

    探索场景中的不同属性。

  2. 打开 rules/windmill.cga 规则文件。

    请注意这些属性如何控制一系列要素,包括圆柱形和重复性元素。 您将在此处深入探讨将控点集成到这些独特几何中的方法。

  3. 添加注记,创建基本控点并定义属性值的范围。

    @Handle(shape=UnderRoof)
    @Range(min=3, max=100)
    attr height = 7

    带有复杂窗口控点和屋顶范围的模型

    在旋转视图时,您将注意到该控点不是非常有效。 当视图旋转时,它将在 UnderRoof 范围拐角处的位置之间跳转。 由于范围比建筑物大并且形状与建筑物不同,因此难以遵循模型与控点之间的关联。

  4. 修改基本控点并禁用范围限制。

    @Handle(shape=UnderRoof, reference=center, slip=screen)
    @Range(min=3, max=100, restricted=false)
    attr height = 7

    现在,参数 reference=center 可将控点附加到范围的中心(有关其他可用参考位置的详细信息,请参阅 CGA 参考)。 参数 slip= 将定义控点在模型外部移动的方向。 在此情况下,slip=screen 指定它平行于相机的 2D 屏幕移动。 由此产生的控点运动将更加平滑和清晰。

添加半径控点

您可以继续在屏幕的顶部和底部添加两个控点,用于控制风车的半径。

  1. 添加注记以创建半径控点:

    @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

  2. 旋转视图。

    带有控点的风车

    在围绕模型旋转视图时,您可以注意到两个新控点针对模型的几何进行了相应移动。 参数 reference=radial 用于放置控点以测量圆柱的半径;align= gives 用于为“视口”窗口上的控点提供首选位置。 使用 align 可确保每个控点具有一致的屏幕视口位置。 否则,bottomRadius 控点可能会显示在模型顶部。

创建链控点

在许多模型中,单个属性将影响多个部分。 在此风车示例中,bladeLength 属性可更改四个叶片中每个叶片的长度。

CityEngine 可将这些控点链接在一起,并针对每个属性显示单个链。

  1. bladeLength 属性添加控点注记:

    @Handle(shape=Blade, axis=x, reference=origin)
    attr bladeLength = height * 0.6

    根据视图方向,可能会显示不同的控点链。 在本示例中,CityEngine 将针对风车叶片显示一个由两个控点组成的链:

    具有链控点的风车

  2. 可以使用 repeat=none 参数关闭链行为。

    @Handle(shape=Blade, axis=x, reference=origin, repeat=none)
    attr bladeLength = height * 0.6

    带有非链条控点的风车

为门和窗口添加控点

windowScale 属性更加复杂,用于控制窗口和门的大小。

注:
单个规则 Windoor 可同时创建窗口和门。

  1. 可以创建用于控制 windowScale 属性的控点。

    @Handle(shape=Windoor, axis=y)
    @Range(min=0.1, max=1.5)
    attr windowScale = 1

    带有窗口控点的风车

    提示:

    编辑 height 属性将显示不同数量的窗口。

    另一个关于 windowScale 属性的观察结果是缩放因子的值与窗口的大小不同。 此外,每个窗口或门都具有与其相关联的不同大小的范围。 CityEngine 将在重复元素上方放置控点链,并缩放每个控点的长度以匹配每个范围。 拖动此类线性控点(其值与控点的长度不同)将在括号中显示实际长度。

    带有窗口比例控点的窗口

  2. 将鼠标悬停在控点上方,直到高亮显示其所附加的范围为止。

    对于所有控点类型,都会发生此行为。 在此,Windoor 范围以蓝色显示。

    风车门控点

  3. 从不同的视图方向探索控点放置。

    带有所有控点的风车

第 3 部分:其他类型的控点

在本教程最后的工作流中,您将查看颜色、切换和旋转控点,并将通过移除范围来隐藏控点。

向模型添加范围

在使用不熟悉的 CGA 代码时,使用模型等级窗口来探索可用范围通常非常有用。

  1. 打开 part 3.cej 场景
  2. 在场景中生成模型。
  3. 打开 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
    
    # (…)

  4. 在本教程的第 1 部分第 2 部分中,您使用了线性控点。 除了这些类型之外,控点还可以控制其他类型的属性。 接下来,您将在模型头部上方添加一个颜色控点。
  5. 单击窗口 > ,打开模型等级窗口。
  6. 单击检查模型工具,打开形状树。
  7. 单击模型头部以显示模型等级中的范围。
  8. 导航等级以定位具有唯一名称的相应范围。

    在此处,HeadHandle 似乎是放置控点的合适范围。 将控点附加到 X 将是不理想的,因为它在该 CGA 规则的多个地方被使用。

  9. 将鼠标指针悬停在模型等级窗口中的 HeadHandle 上。

    它显示该规则有一个输入参数 one,其当前值为 sphere.obj

    检查模型

创建颜色控点

现在,您将为在上一部分中确定的 HeadHandle 范围添加一个颜色控点。

  1. 为名为颜色的属性添加以下注记:

    @Handle(type=color, shape=HeadHandle^1, axis=y, reference=center)
    @Color
    attr color = "#888888"

    对于 shape=HeadHandle^1,将使用范围的规则名称和该规则采用的参数数量来标识该范围。 在之前的示例中,您已经能够排除该参数数目标识符,因为它为零。 颜色属性为字符串,通过使用参数 type=color,可以在“视口”窗口中对其进行编辑。 颜色、切换和选择器控点的行为与线性控点不同:axis=y 用于指定控点可能沿 y(向上)方向移动,而 reference=center 用于将控点附加到范围中心的单个点。

  2. 生成模型。

    现在它已经包含一个颜色控点,显示为一个三角形。 如果您将鼠标悬停在此新控点上,会出现一个颜色轮,可用于编辑颜色属性。

    带有颜色控点的模型

    在三角形内部单击并拖动会改变颜色的饱和度和亮度,而按住单击并围绕大圆拖动则会改变色相。 先前选择的颜色会以更小的圆圈显示在外边缘。

控制控点可见性

可以通过控制其关联范围在规则中的生成来隐藏控点。 将由单个已导入规则实例来创建该模型的每条手臂和腿部。 每个已导入实例都具有 3 个用于控制肢体位置的参数。 然而,这 12 个控点会为模型增加大量视觉混乱。 因此,需要将这些控点附加到仅当布尔属性 (showLimbHandles) 为 true 时才会创建的可选范围。

  1. 将控点附加到可选范围。

    @Handle(type=toggle, shape=HeadHandle^1, slip=screen, align=right)
    attr showLimbHandles = false

    控点类型切换是为布尔属性提供的,显示为方形开关。 这次,将使用 slip=screenalign=right 以将控点放置在球形头部右侧的一致位置。

  2. 添加控点注记后,按 Ctrl+S 保存,然后按 Ctrl+G 重新生成模型。

    带有开关控点的模型

  3. 通过单击切换控点,或者通过单击并上下拖动,可以控制切换控点。

    使用控点将 showLimbHandles 设置为 true。 当激活时,将为每个肢体显示旋转控点。 这些控点可用于根据需要为人物模型摆姿势。

默认情况下,旋转控点不会随着视图方向的更改而移动。 然而,从侧面看它们是不可见的。 要使用某个控点,旋转相机围绕模型通常可以提供更好的控制。 您可以看到所有定位在模型上的控点,以及通过使用此方法编辑模型而受影响的属性。 请探索控点的所有可能性以及如何将它们应用到您的模型中。