split 操作

语法

XYZ 分割(笛卡尔空间)

  • split(axis) { size1 : operations1 | size2 : operations2 | ... | sizen-1 : operationsn-1 }
  • split(axis) { size1 : operations1 | size2 : operations2 | ... | sizen-1 : operationsn-1 }*
  • split(axis, adjustMode) { size1 : operations1 | ... | sizen-1 : operationsn-1 }
  • split(axis, adjustMode) { size1 : operations1 | ... | sizen-1 : operationsn-1 }*

UV 分割(纹理空间)

  • split(direction, surfaceParameterization, uvSet) { size1 : operations1 | ... | sizen-1 : operationsn-1 }*

参数

XYZ 分割(笛卡尔空间)

  1. axis - 选择器
    { x | y | z } - 分割时随沿的轴的名称。 这与局部坐标系(即,范围)相对。
  2. adjustMode
    { adjust | noAdjust } - 用于控制所计算形状的范围计算的可选选择器。 默认设置是将范围调整为几何的边界框。 使用 noAdjust 可以避免这种情况,因此生成的形状的范围将无缝填充父项的范围。

UV 分割(纹理空间)

  1. direction - 选择器
    { u | v } - 分割时随沿的轴的名称。
  2. surfaceParameterization - 选择器
    { uvSpace | unitSpace } - uvSpace 是由 uv 坐标定义的平面纹理空间;unitSpace 是 3d 几何表面上的 2d 空间,以单位(例如米)进行测量。
  3. uvSet - 浮点型
    纹理(集合/图层)的编号(整数(范围 [0,9]))。 编号与材料属性的纹理图层相对应。

有关纹理图层 ID 的详细信息,请参阅绘制纹理

常规

  1. size - 浮点型
    分割的宽度。 根据前缀,沿 axis 的宽度可用以下方式解释:
    • 无前缀(绝对)- 新形状将具有完全相同的 size
    • '(相对)新形状的大小将是 size * 当前范围大小
    • ~(浮动)使用 ~ 前缀,具有绝对维度的分割部分之间的剩余空间将自动调整。 如果在一个分割内定义了多个浮动部分,则将按比例对维度进行加权。
  2. operations
    要在新创建的形状上执行的形状操作的顺序。
  3. *
    重复切换按钮:重复切换按钮触发已定义分割的重复操作(分割为当前形状的 scope),并进行尽可能多的重复。 将调整重复次数和浮动维度以适合最佳解决方案(最佳重复次数和最小拉伸)。

描述

XYZ 分割(笛卡尔空间)

split 操作将沿指定范围轴的当前形状细分为一组较小的形状。 对于大括号内的每个 size-operation 块,将新形状推入形状堆栈,执行多个形状操作,然后将再次弹出形状堆栈顶部的形状。

如果将可选的重复切换按钮 * 附加到分割操作中,则会以与其沿选定轴完全适合 scope 的维度的相同频率重复 {...} 的内容。

在两个块之间的每个交点处(即,在 size1, size2, ... sizen-1 处)使用垂直于分割轴的平面切割当前形状的 geometry。 切割后关闭空心网格,即切割平面引入新的表面以保留体积。

分割可以嵌套,即,size : operation 块可替换为 {...} 块。 从理论上讲,嵌套级别是无限的。

UV 分割(纹理空间)

分割也可以应用于 2d uv 纹理域。 纹理坐标在 3d 表面上定义 2d 参数空间。 此类参数化的示例是街道(沿 w 街道方向的 u,沿宽度的 v)和立面(使用 setupProjection()projectUV() 生成,沿宽度的 u,沿高度的 v)。 这允许直接在表面上操作。 通常,uv 坐标在 [0,1] 范围内,并且未连接到表面上的米或码等单位(由基础网格定义)。 将 direction 参数设置为 unitSpace 以直接在地面上操作,即以单位(例如米或码)工作。 根据参数化的几何和类型,此转换中存在一些固有变形。

uv 分割的边界(开始,结束)由在选定的 uv 坐标中找到的最小值和最大值定义。 分割的一般语法与上述笛卡尔情况相同,即,可以使用相对和浮点运算符('~)以及重复运算符 (*)。 请参见以下示例

形状属性

每个生成的形状将设置许多属性:

  • split.index:所选组件从零开始的索引。
  • split.total:选择器选择的组件总数。

索引和总数是全球性的;例如

...
     primitiveCube()
     split(x) { '0.1 : A | '0.1 : B }*

将创建与具有规则 B 的 5 个形状交错的具有规则 A 的 5 个形状,其中 split.index 为 0 到 9,所有偶数位于规则 A,所有奇数位于规则 B,而 split.total 将为 10。

有关详细信息,请参阅分割属性

相关内容

示例

安装

这是分割前的初始形状。 我们将展示一些沿 x 轴的分割示例,当前形状的 scope.sx 为 10。

以下是用于对分割中创建的形状进行着色和调整大小的规则:

X(h)-->
   s('1,'h,'1)
   color("#0000ff")
	
Y(h)-->
   s('1,'h,'1)
   color("#ffff00")
	
Z(h)-->
   s('1,'h,'1)
   color("#00ff00")
分割前的初始形状

相对大小

此示例显示了相对前缀的用法。 绿色的 Z 形状占初始形状大小的一半(5 个单位),依此类推。 x 方向上所有形状大小的总和为 8,因此末端是间隙。

A-->
   split(x){ '0.5 : Z 
           | '0.1 : Y(2) 
           | '0.2 : X(1) }
使用浮动前缀分割

仅浮动大小:比率

与上面相同的示例,但是所有大小都带有浮动前缀。 请注意如何填充整个初始范围(末尾没有间隙),并保持比率。

A-->
   split(x){ ~0.5 : Z 
           | ~0.1 : Y(2) 
           | ~0.2 : X(1) }
使用用法前缀分割

绝对和浮动大小

在此,于两个绝对大小的形状之间构建浮动大小的形状。 其大小将被从 3 调整到 1.7,以满足绝对限制。

A-->
   split(x){ 3.3  : Z(1) 
           | ~3   : Y(2) 
           | 5    : X(1) }
绝对形状之间的浮动大小形状

过大

第一个形状 Z(绿色)适合,但第二个形状 Y(黄色)被以大小 5 进行切割。 不会创建 X,因为已没有空间。

A-->
   split(x){ '0.5 : Z(1) 
           | '0.6 : Y(2) 
           | 3    : X(1) }
过大的分割形状

以绝对大小重复分割

重复分割示例。 所有大小都是绝对的。 XY 模式重复 3 次,剩余的单元用 X 的一半填充,即最后一个 X 的几何形状被切除。

A--> 
   split(x){ 2 : X(2) 
           | 1 : Y(1) }*
以绝对大小重复分割

以浮动大小重复分割

如果在重复分割中使用浮动大小,则不会剪切任何形状,但会调整大小,以保持元素之间的比率,并填充整个范围。

A--> 
   split(x){ ~2 : X(2) | 
             ~1 : Y(1) }*
以浮动大小重复分割

交错的重复分割

交错的分割,由两端的两个绝对大小的形状和中间的重复分割组成。 注意:绿色形状 Z 具有绝对大小,而黄色形状 Y 具有浮动大小,结果为 0.9。

A-->
   split(x) { 1 : X(3) 
            | {  ~1 : Y(2) 
              | 0.2 : Z(1) 
              | ~1  : Y(2) }*
            | 1 : X(3) }
交错的重复分割

节奏

在此演示如何实现模式 ABABABA 等。 注意黄色 Y 形状的浮动大小。

A-->
   split(x) { { 1  : X(3) 
              | ~3 : Y(1) }* 
            | 1 : X(3) }
节奏分割

剪切几何

在此演示如何将当前形状的几何剪切为许多较小的形状。 将圆柱模型插入当前形状。

A-->
   i("cylinder.hor.obj")
   t(0,'0.5,0)
剪切前的几何

分割形状并在分割规则中使用 NIL 会产生孔。 注意剪切表面是如何闭合的。

A-->
   i("cylinder.hor.obj")
   t(0,'0.5,0)
   split(x) { { ~0.75 : XX 
              | ~1    : NIL }*  
            | ~0.5 : XX }
使用闭合面剪切后的几何

uv 分割基础知识

uvSpace 中的 u 分割 - 分割发生在 u = 0.5 处,与立面大小无关。

Init-->
   extrude(scope.sx * 0.5)
   comp(f) { front : Facade }
	
Facade-->
   setupProjection(0, scope.xy, '1, '1)
   projectUV(0)
   texture("builtin:uvtest.png")
   split(u, uvSpace, 0) { 0.5 : X }*
uv 分割

unitSpace 中的 u 分割 - 分割发生在 u = 5 处,与立面大小有关。

Init-->
   extrude(scope.sx * 0.5)
   comp(f) { front : Facade }
	
Facade-->
   setupProjection(0, scope.xy, '1, '1)
   projectUV(0)
   texture("builtin:uvtest.png")
   split(u, unitSpace, 0) { 5 : X }*
应用了 unitSpace 的 UV 分割

街道上的 UV 分割

具有两个路段的街道上的测试纹理。 街道的纹理坐标是自动生成的;请注意,这两个街道路段的长度不同,但是都被 [0,1] uv 空间覆盖,u 轴沿街道方向,v 轴沿宽度垂直于 u。

Street-->
   texture("builtin:uvtest.png")
街道上的 UV 分割

unitSpace. 每 20 米进行一次 u 分割后,同一条街道上会绘制一个 3 米宽的波段。

Street-->
   split(u, unitSpace, 0) { ~10 : NIL 
                          | ~3  : color("#ff0000") 
                                  X  
                          | ~10 : NIL }*
街道上应用了 unitSpace 的 UV 分割

在本主题中