在 three.js 中中止 object3d.traverse

abort object3d.traverse in three.js

遍历 three.js 对象时如何中止遍历?

scene.traverse(x => {
        if (x.userData) 
             // stop traversing here
});

return 和中断不起作用

Object3D.traverse code (r134)

您需要修改 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 递归链,直到它退出原始调用。