可见性与图层

对于节点和派生自节点的元素(也就是挂载了Transform组件的元素),都有visiblelayer两个属性可选。这两个属性用于控制节点自身以及其子孙结点的可见性

当我们需要一个开关直截了当地让某个节点之下的所有模型或者灯光都显示或者不显示,最方便的方法就是使用visible

<xr-node visible="false">
  <xr-mesh visible geometry="cube" />
</xr-node>

比如这个例子,所有节点的visible默认都是true,但当父节点设置为false时,即便子节点显式定义了true,也会被隐藏。

除了这种场景,在另外一些场景我们还会有更复杂的需求,比如只是想针对性地剔除掉某一类模型或是灯光,而非按照层级结构,这时候图层layer就派上用场了,让我们来看个例子:

<xr-node layer="1">
  <xr-mesh geometry="sphere" uniforms="u_baseColorFactor:0.937 0.176 0.368 1" />
  <xr-node layer="2">
    <xr-mesh geometry="cylinder" uniforms="u_baseColorFactor:1 0.776 0.364 1" />
  </xr-node>
</xr-node>
<xr-camera
  position="0 1.6 0" clear-color="0.925 0.925 0.925 1"
  cull-mask="0b01"
/>

对于两个xr-node节点,我们给第一层指定了layer=1,第二层指定了layer=2,然后将xr-camera节点的cull-mask属性(对应于Camera组件的cullMask数据)设置为0b01。如此设置的效果应该是第一个mesh被渲染,第二个不被渲染。

开发者看到这里应该不难发现图层的规则:layer可以设置1~32共32个值,而相机的cullMask是一个32位无符号整数,每一位都代表一个layer。只有当一个节点从顶层到自身路径中的所有节点都通过了这个mask的测试,才会被显示出来。这也适用于灯光Light组件。