在javascript(three.js)中使用函数:.load()后,如何防止对象被破坏

How can I prevent an object to be destroyed after I used the function: .load() in javascript (three.js)

本文关键字:何防止 对象 load 函数 js three javascript      更新时间:2024-01-23

我正在努力防止我的对象在加载后被破坏。

var loader = new THREE.ColladaLoader();
var rescue;
loader.load(
    'Improved_Person_Maker_better_quality.dae',
    function(collada) {
        scene.add(collada.scene);
        collada.scene.position.set(-25, 1, 25);
        collada.scene.rotation.x = -Math.PI / 2;
        rescue = collada.scene;
    },
    function(xhr) {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
    }
);
rescue.position.set(-20, 1, 25);

最后一条语句不可能,因为加载的网格已不存在。有办法拯救collada.sene吗?

加载程序是异步的。

这意味着rescue.position.set()在加载器回调中定义rescue之前被调用。

只需在回调中设置位置,您已经完成了此操作。

如果您稍后必须在代码中引用rescue,则可以使用此模式

if ( rescue !== undefined ) {
    // your code
}

three.js r.75

你可以试试这个:

var rescue; 
var manager = new THREE.LoadingManager();
manager.onProgress = function(item, loaded, total) {
    console.log(item, loaded, total);
};
manager.onLoad = function(){
       rescue.position.set(-20, 1, 25);
};
var loader = new THREE.ColladaLoader(manager);
loader.options.convertUpAxis = true;
loader.load("<url path for the file>", function(collada) {
       scene.add(collada.scene);
       collada.scene.position.set(-25, 1, 25);
       collada.scene.rotation.x = -Math.PI / 2;
       rescue = collada.scene;
    }, function(xhr) {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
});
}

Loading Manager为您提供了异步管理加载的灵活性,这样以后您就可以拥有多个文件。

非常感谢Stallion和Westlangley为我提供了异步加载的正确提示。

我在这里找到了一个解决方案,但我也会复制它。

解决方案是创建一个普通的THREE.Object3d()对象。可以将每个对象添加为另一个对象的子对象。所以我做了以下事情:

loadObject: function(){
    var loader = new THREE.ColladaLoader();
    var container = new THREE.Object3D();
     loader.load(
'Improved_Person_Maker_better_quality.dae',
function ( collada ) {
    container.add(collada.scene);
},
function ( xhr ) {
    console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
});
    return container;
}

出于灵活性的原因,我创建了一个新功能。