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

How to load a model once and store it to a variable?

本文关键字:存储 变量 一次 何加载 加载 模型      更新时间:2023-09-26

我在加载这样的模型时遇到了一个问题:

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。

我认为,当您尝试将模型添加到加载程序之外时,模型没有显示在场景中的原因是因为加载是异步完成的。这意味着,当加载程序正在加载时,其余的代码将运行。因此,如果你试图在加载功能之后直接将"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
}
});