如何加载模型一次并将其存储到变量?

时间:2015-03-29 13:40:23

标签: javascript model three.js load

我有一个问题,我加载这样的模型:

var Beech;
var loader = new THREE.JSONLoader();
loader.load( "./models/trees/Beech/Beech.json", function( geometry, materials ) {
Beech = addMorphTree(geometry,materials,0.5); });

并像这样使用它:

function addMorphTree(geometry,material,scale){
            mat=new THREE.MeshFaceMaterial( material );
            mat.side=THREE.DoubleSide;
            Tree = new THREE.Mesh( geometry,mat);
            Tree.scale.set(scale,scale,scale);
            //Tree.position.set(x,y,z);
            Tree.rotation.x = Math.PI/2;

            //scene.add( Tree );
        return Tree;}

我的问题是如何使用此变量创建模型的副本而不是每次都加载它?当我尝试使用

scene.add(Beech);

在装载机外部,模型没有显示出来。我已经看到了其他类似的问题,但所有答案都在装载机内部使用scene.add。

2 个答案:

答案 0 :(得分:0)

目前我无法发表评论,但我花了半分钟时间才找到相关信息:

How to clone collada model in threejs?

https://github.com/mrdoob/three.js/issues/1363

我不想将这里的信息复制为其他人的努力,归功于他们......

原理相同

答案 1 :(得分:0)

我认为当你尝试将它添加到加载器之外时,模型没有出现在场景中的原因是因为加载是异步完成的。这意味着,在加载器加载时,其余代码将运行。因此,如果您尝试在加载功能之后直接将“Beech”添加到场景中,它将无法完成加载。

var Beech;
var loader = new THREE.JSONLoader();
loader.load( "./models/trees/Beech/Beech.json", function( geometry, materials ) {
Beech = addMorphTree(geometry,materials,0.5); });
scene.add(Beech);  // <-- this will run before the function above is finished,
                   //thereby adding a undefined variable to the scene.

如果您想要多个变量实例,也许您可​​以尝试使用clone()函数。由于Beech是Mesh对象,Mesh继承自Object3D,因此它也可以使用Object3D成员函数。

var Beech;
var loader = new THREE.JSONLoader();
loader.load( "./models/trees/Beech/Beech.json", function( geometry, materials ) {
Beech = addMorphTree(geometry,materials,0.5); 
for(var i=0;i<5;i++){
  scene.add(Beech.clone()) //creates 5 trees
}
});