three.js源碼翻譯-Layers.js
說明
- layer(層級)的概念不論是在哪個引擎或者3d庫中都是很重要的,因爲在實際的開發中,是有多個層級的實際要求的。
- 比如在關卡遊戲中,往往一關中不只有boss關,之前也會有精英怪之類的,這時候通過層級就可以在同一關中精英怪和boss就可以無縫切換了。
源碼
源碼位置
arc/core/layers.js
源碼
/**
* @author mrdoob / http://mrdoob.com/
*/
/**
* 層級的概念其實是很重要的,比如在第一層放一些東西,然後在其他層放了一些東西,這樣通過換層級來控制模型或者
* 其他東西的顯隱,在構建一些複雜的功能的時候是很重要的
*/
function Layers() {
//默認層級爲1
this.mask = 1 | 0;
}
//原型方法
Object.assign( Layers.prototype, {
/**
* 設置層級
* @param {*} channel
*/
set: function ( channel ) {
this.mask = 1 << channel | 0;
},
//設置層級的數字 與disable配合使用
enable: function ( channel ) {
this.mask |= 1 << channel | 0;
},
//控制層級的顯隱
toggle: function ( channel ) {
this.mask ^= 1 << channel | 0;
},
//取消設置層級的數字
disable: function ( channel ) {
this.mask &= ~ ( 1 << channel | 0 );
},
//判斷兩個層級是否相同
test: function ( layers ) {
return ( this.mask & layers.mask ) !== 0;
}
} );
實例
實例代碼
/*相機裏的設置是必要的*/
camera.layers.enable( 0 ); // enabled by default
camera.layers.enable( 1 ); camera.layers.enable( 2 );
/*燈光裏的設置是非必要的*/
light.layers.enable( 0 );
light.layers.enable( 1 ); light.layers.enable( 2 );
/*各層之間的顯隱控制*/
'toggle red': function() {
camera.layers.toggle( 0 );},
'toggle green': function() {
camera.layers.toggle( 1 );
},
'toggle blue': function() {camera.layers.toggle( 2 );
},
'enable all': function() {
camera.layers.enableAll();
},
'disable all': function() {
camera.layers.disableAll();
}
案例地址
個人理解
layer這個概念在各個引擎,尤其是編輯器比較豐富的引擎中層級的概念是很重要的,反而three中的層級是計較雞肋的,個人感覺在three中至少應該把layer提升到group的層級,甚至提升到scene,通過雙向綁定把需要的mesh和各個層級進行關聯。