Three.js Layers

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值