在 three.js 中中止 object3d.traverse
abort object3d.traverse in three.js
遍历 three.js 对象时如何中止遍历?
scene.traverse(x => {
if (x.userData)
// stop traversing here
});
return 和中断不起作用
您需要修改 traverse
函数以根据回调函数的输出退出。
像这样(未经测试):
// three.js/src/core/Object3D.js
traverse( callback ) {
let bailedOut = callback( this );
if( !bailedOut ) {
const children = this.children;
for ( let i = 0, l = children.length; i < l && !bailedOut; i ++ ) {
bailedOut = children[ i ].traverse( callback );
}
}
return bailedOut;
}
然后这样称呼它:
function doTheThing( node ) {
let bailOut = false;
if( node.userData ) {
bailOut = true;
}
else {
// do the thing
}
return bailOut;
}
scene.traverse( doTheThing );
处理基本上会一直持续到您的回调 returns true
,此时它会触发级联备份 traverse
递归链,直到它退出原始调用。
遍历 three.js 对象时如何中止遍历?
scene.traverse(x => {
if (x.userData)
// stop traversing here
});
return 和中断不起作用
您需要修改 traverse
函数以根据回调函数的输出退出。
像这样(未经测试):
// three.js/src/core/Object3D.js
traverse( callback ) {
let bailedOut = callback( this );
if( !bailedOut ) {
const children = this.children;
for ( let i = 0, l = children.length; i < l && !bailedOut; i ++ ) {
bailedOut = children[ i ].traverse( callback );
}
}
return bailedOut;
}
然后这样称呼它:
function doTheThing( node ) {
let bailOut = false;
if( node.userData ) {
bailOut = true;
}
else {
// do the thing
}
return bailOut;
}
scene.traverse( doTheThing );
处理基本上会一直持续到您的回调 returns true
,此时它会触发级联备份 traverse
递归链,直到它退出原始调用。