Layers 对象为 Object3D 分配 1个到 32 个图层。在内部实现上,每个图层对象被存储为一个 bit mask(通过1<<channel以及其它位运算设置mask值,一个Layers对象可以有多个chanel), 默认的,所有 Object3D 对象都存储在第 0 个图层上。
Layers对象虽然命名上叫图层,但该对象并不是与渲染数据、图像、图层层面相关的对象,更像是逻辑层面上控制Object3D对象是否显示的tag标签一样,用于和camera进行test比较,控制Object3D对象的显示。
class Layers {
constructor() {
this.mask = 1 | 0;
}
//删除图层对象已有的所有对应关系,增加与参数指定的图层的对应关系。
set( channel ) {
this.mask = ( 1 << channel | 0 ) >>> 0;
}
//增加图层对象与参数指定图层的对应关系。
enable( channel ) {
this.mask |= 1 << channel | 0;
}
//添加所有层的对应关系
enableAll() {
this.mask = 0xffffffff | 0;
}
//根据参数切换对象所属图层。若channel开,着toggle后关闭该图层,若channel关,则toggle后开
toggle( channel ) {
this.mask ^= 1 << channel | 0;
}
//删除图层对象与参数指定图层的对应关系。
disable( channel ) {
this.mask &= ~ ( 1 << channel | 0 );
}
//删除所有层的对应关系。
disableAll() {
this.mask = 0;
}
//如果传入图层对象与当前对象属于相同的一组图层,则返回 true,否则返回 false。
test( layers ) {
return ( this.mask & layers.mask ) !== 0;
}
//判断给定的channel是否enable
isEnabled( channel ) {
return ( this.mask & ( 1 << channel | 0 ) ) !== 0;
}
}
export { Layers };
图层对象可以用于控制对象的显示。render在调用render(scene,camera)方法进行渲染时,会调用object内置Layers的test方法与camera的layer进行对比判断是否渲染object,当object与camera存在相同channel时,object才能visible。
应用:设置场景内object的Layers对象的mask(即channel)的不同值,camera设置多channel,通过camera内部的Layers对象toggle方法切换channel,能够控制与camera存在同一channel的object的显示。源码例子:/examples/webgl_layers.html