split

概要

XYZ分裂(笛卡尔空间)

  • split (splitAxis) { size1:operations1 | size2:operations2 | …… | 大小(n-1):操作(n-1)} 
  • split (splitAxis) { size1:operations1 | size2:operations2 | …… | 大小(n-1):操作(n-1)} * 
  • split (splitAxis,adjustSelector) { size1:operations1 | size2:operations2 | …… | 大小(n-1):操作(n-1)} 
  • split (splitAxis,adjustSelector) { size1:operations1 | size2:operations2 | …… | 大小(n-1):操作(n-1)} * 

UV分裂(纹理空间)

  • split (splitDirection,surfaceParameterization,uvSet) size1:operations1 | …… | 大小(n-1):操作(n-1)} *

参数

XYZ分裂(笛卡尔空间)

  1. splitAxis – selstr
    x | y | z } – 要分割的轴的名称。这是相对于局部坐标系(即范围)。
  2. adjustSelector – selstr
    adjust | noAdjust } – 可选的控制器,用于控制计算出的形状的范围。默认设置是将范围调整为几何体的边界框。使用noAdjust避免了这种情况,因此,结果形状的范围填充了父级的范围而没有间隙。

UV分裂(纹理空间)

  1. splitDirection – selstr
    u | v } – 要拆分的轴的名称。
  2. surfaceParameterization – selstr
    uvSpace | unitSpace } – uvSpace是由uv坐标定义的平面纹理空间; unitSpace是3d几何表面上的2d空间,以单位(例如米)为单位。
  3. uvSet –整数(范围[0,5])
    集合/图层的纹理数量。编号对应于材质属性的纹理图层。

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

一般

  1. 大小 –浮动
    分割宽度。根据前缀,沿的宽度按以下方式解释:

    • 没有前缀(绝对) – 新形状将具有完全相同的大小
    • ‘(相对) – 新形状的大小将是大小*当前范围大小
    • 〜(浮动) – 使用前缀,自动调整具有绝对尺寸的分割部分之间的剩余空间。如果在分割中定义了多个浮动零件,则按比例对尺寸进行加权。
  2. 操作
    要在新创建的形状上执行的一系列形状操作。
  3. *
    重复开关:重复开关触发重复定义的分割到当前形状的范围,尽可能多次。重复次数和浮动尺寸适应最佳解决方案(最佳重复次数和最小拉伸次数)。

描述

XYZ分裂(笛卡尔空间)

所述分裂操作细分沿指定范围轴当前形状为一组更小的形状。对于花括号内的每个尺寸操作块,将新形状推到形状堆栈上,执行多个形状操作,并再次弹出形状堆栈顶部的形状。

如果将可选的重复开关*附加到拆分操作,{…}的内容将重复,因为它完全适合沿所选轴的范围尺寸。

在两个块之间的每个交叉处(即,尺寸1,尺寸2,……尺寸(n-1)用垂直于分割轴的平面切割当前形状的几何形状。中空网格在切割后关闭,即切割平面引入新表面以保持体积。

拆分可以嵌套,即大小:操作块可以用{…}块替换。从理论上讲,嵌套级别是无限的。

UV分裂(纹理空间)

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

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

形状属性

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

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

指数和总数是全球的; 例如

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

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

有关更多信息,请参阅split属性

有关

例子

建立

这是拆分前的初始形状。我们将沿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 = 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 }*
紫外线分裂

你在unitSpace中分裂 – 分裂发生在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分割
 

街道上的紫外线分裂

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

Street-->
   texture("builtin:uvtest.png")
紫外线在街道上分开

unitSpace中拆分后的同一条街道每20米就有一条3米宽的带子穿过街道。

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

Was this article helpful?

Leave A Comment?

You must be logged in to post a comment.