我很遗憾在这里再次提出这个问题。我知道成员os Stack Overflow不适合我的专属 使用,但真的需要找到解决这个问题的方法。
让我解释得更好,因为上次我不清楚我想要什么。
我使用THREE.JS来开发类似RPG的游戏。我想到的是一款像IronBane MMO一样的游戏,但没有 现在的Web服务器功能(仅用于单人游戏)。
我是THREE.js的新手,在某些时候,我开始在一个库中工作来处理对象加载我 我的水平。因为我使用3DStudio Max来制作模型,所以我决定使用提供的OBJMTLLoader库。
我已经确定了加载de静态对象的函数及其类似的东西。
function loadObject(obj,mtl,pos){ // Adiciona objeto sem vinculá-lo a uma variável
var loader = new THREE.OBJMTLLoader();
loader.load( obj, mtl, function ( object ) {
object.position.set(pos[0],pos[1],pos[2]);
scene.add( object );
});
}
当我需要对此对象进行初始化时,问题就出现了。我试过很多例子:
function addObject(obj,mtl){ // Declara e adiciona um objeto no mapa
var conteudo;
var loader = new THREE.OBJMTLLoader();
loader.load( obj,mtl, function( object ){
conteudo = object;
});
setTimeout(function(){
scene.add( conteudo );
},1000);
当然,conteudo变量未定义。我明白我需要先等待对象加载。它 需要大约2个渲染cicles。为此,我使用setTimeout函数。用scene.add(conteudo)对象 被充分地添加到现场。我尝试使用
return conteudo;
,当我打电话时......
var objeto = new addObject('object path','material path')
我得到了addObject的实例而不是我期望的Object3D。我也尝试在de函数和声明之外声明一个数组 从addObject内部推送它,如下所示:
function addObject(obj,mtl,objectArray)
var loader = new THREE.OBJMTLLoader();
loader.load( obj,mtl, function( object ){
conteudo = object;
});
setTimeout(function(){
scene.add( conteudo );
objectArray.push( conteudo );
},1000);
在第二个当我在console.log中获取数组时:
Array[1]
0 : THREE.Object3D
length : 1
但是当我尝试使用Array [0]或console.log(Array.length)时,我得到了undefined和0。
如果有人可以帮我解决这个问题,我真的很感激。那将是真棒。谢谢你!
答案 0 :(得分:0)
考虑等待添加对象。
function init(next){
var loader = new THREE.OBJMTLLoader();
loader.load( obj, mtl, function ( object ) {
object.position.set(pos[0],pos[1],pos[2]);
conteudo = object;
next();
});
}
function next(){
scene.add( conteudo );
objectArray.push( conteudo );
console.log(objectArray)
... work from here, here you are sure that the model is loaded ...
}
init(next);
等待对象加载,然后它将在下一步执行。