setback 操作

语法

  • setback(distance) { selector operator operations | ... }
  • setback(distance, uvSet) { selector operator operations | ... }
  • setback(distances) { selector operator operations | ... }
  • setback(distances, uvSet) { selector operator operations | ... }

参数

  1. distance - float
    退缩距离。
  2. distances - float[]
    包含每个面边的对应退缩距离的数组。
  3. uvSet - float
    用于基于 uv 的选择器的 uv 集。 默认值为 0。
  4. selector - selector
    • { front | back | left | right | top | bottom | side } - 将分析将面平面中边的向外法线,方法为将其方向分类到对应的范围象限中。
    • { object.front | object.back | object.left | object.right | object.top | object.bottom | object.side } - 将分析将面平面中边的向外法线,方法为将其方向分类到对应的对象坐标系象限中。
    • { world.south | world.north | world.west | world.east | world.up | world.down | world.side } - 将分析将面平面中边的向外法线,方法为将其方向分类到对应的世界坐标系象限中。
    • { street.front | street.back | street.left | street.right | street.side } - 可以使用 street.front 选择器选择与街道相邻的边,可以使用 street.back 选择器选择后部边,并且可以使用 street.left street.right 选择器选择位于前后之间的边。street.side 用于合并左侧边和右侧边。 这些选择器取决于 streetWidth 属性映射的可用性;请参阅自动生成的街道宽度属性。 如果该属性不可用,则组件选择将回退到 object.xxx 选择器。
    • { uv.left | uv.right | uv.bottom | uv.top } - 根据 uv 坐标来选择边。 将分析每条边的外向法线以对边进行分类,其中 (left, right) 为负向,u 轴为正向,(bottom, top) 为负向和正向 v 轴。
    • { uv.uMin | uv.uMax | uv.vMin | uv.vMax } - 根据 uv 坐标来选择边。 如果为两个端点都分配了相应 uv 轴的几何最小 (uMin, vMin) 或最大 (uMax, vMax) 值,则将选择边。
    • all - 选择所有边。
    • isTagged(tagQuery) - 选择标记的边。 另请参阅本部分以了解更多详细信息。

      注:

      还可以根据相邻面上的标签来选择边。

    • 逻辑表达式 (bool) - 选择表达式计算结果为 true 的所有边。 用户定义的函数以及上述选择器均可在表达式中使用。
    • index(浮动) - 选择第索引个组件(从 0 开始)。 过大索引和负索引将模回绕为正确索引。
    • remainder - 选择面的其余部分。
      注:

      其余部分取决于所选边,但始终相同,与 remainder 选择器在选择器-运算符序列中的位置无关。

  5. operator
    运算符用于定义如何使用退缩面生成后续形状。 这同样适用于具有多个面的形状。
    • : 将每个面变为新形状。
    • = 所有选定组件将合并成一个新形状。
  6. operations
    要在新创建的形状上执行的形状操作的顺序。

描述

setback 操作用于选择多条边并使其退缩给定距离。 该操作类似于面 offset 操作,区别在于仅退缩一部分边。

可以为所有边指定公共退缩 distance。 或者,可以通过将退缩 distances 数组而不是单个退缩 distance 传递给操作,为每个面边指定单独的距离。 数组必须采用面-边顺序,即第一个元素是第一个面的第一条边的距离,第二个元素为第一个面的第二条边的距离,以此类推。 将单独为每个面考虑共享边。 如果数组未包含足够的元素,则不会在对应的缺失面边上执行任何退缩。 如果数组包含的元素数大于面边总数,则将忽略对应的退缩距离。 可使用 comp 函数构造此类数组,其中 component 设置为 fe(面边)。 setbackPerEdge 操作提供了一种更加便捷的方式来设置各个退缩距离,无需手动构造数组。

组件标签

所有 setback 操作自动将语义组件标签应用于生成的边组件:

形状

"setback.front"

"setback.back"

"setback.side"

蓝色:原始所选边。

绿色:新退缩边。

黄色:侧边。

自动标签形状
setback(4) { front : Shape }

剩余部分

"setback.back"

"setback.side"

"setback.remainder"

绿色:新退缩边。

黄色:侧边。

紫色:原始边。

自动标签剩余部分
setback(4) { front : NIL 
           | remainder : Remainder }

有关使用组件标签的详细信息,请参阅:

相关内容

示例

街道前侧退缩

LotInner --> Lot

Lot-->
   setback(5) { street.front = Garten   |
                remainder    : Building }
    	
Garten --> color("#00ff00")

Building -->
   offset(-3, inside)
   extrude(world.up, rand(5, 15))
街道前侧退缩

各个距离

将在具有 2 个面的形状上使用 comp 函数创建替代距离数组。 请注意,数组中的距离按面-边顺序应用。 每个面的第一条边突出显示。 第一个距离应用于第一个面(左)的第一条边,第 5 个距离应用于第二个面(右)的第一条边。

// (9)[1,6,1,6,1,6,1,6,1]
const dists = comp(fe) { all : 
                         case comp.index%2 == 
                              0 : 1
                         else   : 6 }

Lot --> setback(dists) { all       = Garden   |
                         remainder : Building }
具有替代距离的 comp 函数

在此示例中,comp 函数与不同的 selectorsoperators 搭配使用。

// (9)[4,0,2,0.5,5,0.5,2,2,0]
const dists = comp(fe) { inside = 0   |
                         front  :
                           case comp.index == 
                                0 : 4
                           else   : 5 |
                         back   = 2   |
                         side   = 0.5 }

Lot --> setback(dists) { all       = Garden   |
                         remainder : Building }
具有选择器和运算符的 comp 函数

左:使用 shapeL 操作的左 L 形状。 右:使用退缩的右 L 形状。

Left --> shapeL(5, 5) { shape     = Garden
                        remainder : Building }

// (4)[5,5,0,0]
const dists = comp(fe) { front = 5 | right = 5  }

Right --> setback(dists) { all       = Garden   | 
                           remainder : Building }
shapeL 操作和具有退缩的 shapeL

注:

有关更多示例,另请参阅 setbackPerEdge 操作。