我正在努力防止我的对象在加载后被破坏。
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;
}
出于灵活性的原因,我创建了一个新功能。