inside / overlaps / touches内部/重叠/触摸/功能(遮挡查询)

inside / overlaps / touches / function(遮挡查询)

概要

  • bool里面()
  • bool重叠()
  • bool touches ()
  • bool里面(目标选择器)
  • 布尔重叠(目标选择器)
  • bool touch (目标选择器)
  • bool里面(目标选择器,标签)
  • bool重叠(目标选择器,标签)
  • bool touch (目标选择器,标签)

参数

  1. target-selector –关键字

    查询的目标选择器:

    • 帧内针对在相同的形状树封堵器形状-Checks(即,来自相同的inital形状)。
    • 对在其他形状的树封堵器形状-Checks(即,由其它初始形状在附近产生的)。
    • 所有 -Checks 内部内部

    如果没有给出选择器,则使用全部

  2. label –字符串
    给定标签标识符,仅在与所请求标签匹配的封堵器形状上执行遮挡查询。空标签将表现为未标记的遮挡查询。

返回

如果当前形状的几何形状完全位于内部,重叠或触摸另一个形状的闭合几何体,则为true,否则为false

描述

遮挡查询测试形状之间的交叉点。有四种不同的函数可用于检查当前形状几何的空间上下文:

  • 如果当前形状的几何完全位于指定目标选择器标签之一的闭合几何的表面内或完全位于其内部,则inside()返回true
  • 如果当前形状的几何图形部分位于由target-selectorlabel指定的闭合几何图形之内(或反之亦然),则overlapps()返回true
  • 如果当前形状的几何图形与目标选择器标签指定的闭合几何图形之一重叠或具有平面接触,则touches()返回true

三个遮挡函数的可视定义(白色:遮挡形状;红色:查询形状):

遮挡功能的视觉定义

注意:

在任何情况下,仅针对形成闭合表面的几何形状(即没有边界边缘的防水网格)执行测试。

注意:

了解有关条件和遮挡中遮挡查询的重要特征的更多信息。

未标记的遮挡查询

如果没有给出标签标签为空,则根据使用规则集自动生成的实际选择的闭合封堵器几何形状来测试当前形状的几何形状:

  • 叶子的形状
  • 已应用组件拆分偏移的形状。这些操作通常表示从质量到表面的过渡。此外,这些操作通常应用于简单的几何形状,这些几何形状可以有效地测试以防止遮挡。
  • 任何标记的封堵器形状。

内遮挡

内部遮挡查询仅针对既不是父/祖先也不是查询形状的子/后代的几何形状执行,因为它们很可能由于自上而下的语法建模方法而遮挡当前形状。

有关

例子

内闭塞

此示例演示了touches()遮挡查询对一个形状树形状(遮挡内)的结果。由于没有给出标签,遮挡查询将针对自动生成的遮挡形状进行测试:应用组件拆分的闭合几何。请注意,每个遮挡查询都不考虑前任封堵器形状,即Tile源自的组件拆分卷。在组件拆分和条件错误情况下构造的叶子形状不被考虑,因为它们不形成封闭的几何形状。

Init --> extrude(15)
         split(x) { ~5 : Step }*
		
Step --> s('1, '0.7 * (split.index + 1), '1)
         comp(f) { side: Facade | top: X. }
	
Facade --> split(y) { 4 : Floor }*	

Floor --> case touches(intra):
             color("#ff0000") X
          else:
             X
内遮挡
 

相互遮挡

在该示例中,House规则应用于两个相邻的初始形状(inter occlusion)。自动创建封闭的封堵器形状:块(组件拆分)和屋顶(叶子形状)。不考虑其他叶片形状,因为它们不形成封闭表面。在()内查询阻止,因为它们是由相邻块或屋顶遮挡的不可见砖的插入。的触摸()查询防止堵塞相邻块或屋顶和插入一个壁,而不是窗口的创建。

House --> extrude(5+rand(20))
          comp(f) { side : Facade | top : Roof }

Roof --> roofGable(20) color(1,0,0)

Facade --> split(y) { ~5 : split(x) { ~5 : Tile }* }*

Tile --> case inside(inter) : NIL
         case touches(inter) : Wall.
         else : setback(1) { all : Wall. | remainder : NIL }
 

标签

在此示例中,Field规则应用于一个矩形初始形状(帧内遮挡)。在房屋旁边,随机封闭的树木资产也散落在形状上。为每个树资产(叶子形状)自动创建其他封堵器形状。我们可以在房子的Tile规则中将目标选择器更改为intra

Field --> Ground
          scatter(surface, rand(500), uniform) { Place }
		  
Ground --> color(0,0.5,0)

Place --> 1% : PlaceHouse else : PlaceRandomTree

PlaceHouse --> r(0,rand(180),0)
               primitiveQuad(10+rand(10), 10+rand(10))
               House
			   
PlaceTree --> i(fileRandom("/assets/*.obj"))

Tile --> case inside(intra) : NIL
         case touches(intra) : Wall.
         else : setback(1) { all : Wall. | remainder : NIL }
应用字段规则

这里重叠()用于避免重叠树资产。请注意如何删除所有相互重叠的树,尽管它可能足以删除树资产的子集。另请注意,某些窗口不会出现,因为它们会触及插入的树资源生成的封闭器形状。此示例说明了遮挡查询如何测试在条件错误情况下创建的遮挡形状,该情况插入所有树资源而不管遮挡。

PlaceTree --> i(fileRandom("/assets/*.obj"))
              CheckOverlap

CheckOverlap --> case overlaps(intra) : NIL
                 else : Tree.
使用重叠的标签操作

在此示例中,使用label()操作将房屋块标记为“块” 。此标签用于“ 平铺”规则中的遮挡查询。现在,窗口仅针对与所请求标签匹配的封堵器形状进行测试,而不是针对树资产的自动生成的封堵器形状进行测试。

House --> extrude(5+rand(20))
          label("block")
          comp(f) { side : Facade | top : Roof }

Tile --> case inside(all, "block") : NIL
         case touches(all, "block") : Wall.
         else : setback(1) { all : Wall. | remainder :  Window }
标签操作与房屋块

标签还可以用在树的CheckOverlap规则中的遮挡查询中。因此,树木资产将根据房屋块进行检查,但不会相互对照。

CheckOverlap --> case overlaps(intra, "block") : NIL
                 else : Tree.
使用CheckOverlap进行标签操作
 

具体例子

让我们看一个具体的例子。下图显示了建筑模型。首先,规则通过使用细分分割操作生成U形质量模型。结果,侧翼的几何形状接触主块的几何形状,并且产生不切实际的相交窗口。在下图中,在左侧模型中没有使用遮挡查询; 在中心,遮蔽的窗户是红色的; 在右侧,被遮挡的窗户被丢弃。

闭塞阶段的模型

构造窗口的规则如下所示:

WindowOpening --> Sill s('1,'1,windowSetback) t(0,0,'-1) [ i(openbox) Wall ] Window

该规则首先调用窗台的生成,然后将范围的大小设置为窗口缩进的深度并相应地转换范围。然后插入openbox资产以模拟窗口侧面的墙壁。最后调用实际的Window生成。

为了使此规则对遮挡做出反应,我们添加了touches()条件:

WindowOpening-->
  case touches(intra) : Wall
  else : Sill s('1,'1,windowSetback) t(0,0,'-1) [ i(openbox) Wall ] Window

现在,如果WindowOpening形状的几何体(由典型的立面分割规则生成的矩形多边形)接触另一个形状的几何体,则该规则仅调用Wall规则而不创建窗口。否则,该规则将像以前一样应用。上图显示了右侧生成的建筑模型。

Was this article helpful?