我已经使用three.js加载了obj文件
我尝试获取其顶点“ X”的位置并将其保存在init()函数中的objloader函数内部的“ pos”中。
我想在另一个函数中使用变量的值,例如displayposition()
当我尝试
var pos;
function init() {
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
});
}
function displaypos() {
console.log(pos); //It doesn't display the vertex position value
}
如何使它成为全局变量并使“ pos”的变量值在整个程序中可用。
最佳答案
OBJLoader.load
是一个异步函数,它下载并解析OBJ文件。这可能根本不需要时间,也可能需要几秒钟。
您说您正在呼叫init
,紧接着是displaypos
。这些函数调用是顺序的,因此displaypos
将在init
退出后立即被调用。
操作顺序如下:
创建全局变量pos
定义init
函数
定义displaypos
函数
致电init
将objloader
定义为THREE.OBJLoader
定义objLoader.load
的回调
呼叫objLoader.load
init
退出是因为对objloader.load
的调用是连续的并带有回调
致电displaypos
将undefined
打印到控制台
几秒钟后...objloader.load
的回调称为
将object
添加到scene
设置pos
的值console.log
将正确的值输出到控制台
因此,您的displaypos
调用未打印该值,因为还没有要打印的值...。
您可以将自己的回调添加到init
以使其按预期工作,或者可以重新编写代码以使用Promise
+ async
/await
。
回调版本
var pos;
function init(callback) {
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
callback(); // The real exit point
});
}
function displaypos() {
console.log(pos);
}
init(function(){
displaypos(); // will now display the correct value
});
// alternately: init(displaypos);
承诺+异步/等待
var pos;
async function init() {
return new Promise(function(resolve){
var objLoader = new THREE.OBJLoader();
objLoader.load('objectfile.obj', function(object) {
scene.add(object);
pos = scene.children[5].children[0].geometry.attributes.position.getX(0);
console.log(pos); //This displays the vertex position value
resolve(); // the real exit point
});
});
}
function displaypos() {
console.log(pos);
}
(async function(){
await init();
displaypos(); // will display the correct value
})();