Three.js Layers

Layers 对象为 Object3D 分配 1个到 32 个图层。在内部实现上,每个图层对象被存储为一个 bit mask(通过1<

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。

Three.js Layers_第1张图片

应用:设置场景内object的Layers对象的mask(即channel)的不同值,camera设置多channel,通过camera内部的Layers对象toggle方法切换channel,能够控制与camera存在同一channel的object的显示。源码例子:/examples/webgl_layers.html

你可能感兴趣的:(Three.js,js)