Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何分配Three.js模型文件的可变内容_Javascript_Json_Three.js - Fatal编程技术网

Javascript 如何分配Three.js模型文件的可变内容

Javascript 如何分配Three.js模型文件的可变内容,javascript,json,three.js,Javascript,Json,Three.js,当您将模型从Blender导出到Three.js时,最终会得到一个包含JSON数据的文件。我知道从该文件加载此模型的两种方法: var loader = new THREE.JSONLoader() var material = new THREE.MeshPhongMaterial({color: '#8080a0'}) 一, 二,。编辑tower.js文件并添加 var tower = 在第一行。然后,您可以加载以下内容: var towerModel = loader.parse(t

当您将模型从Blender导出到Three.js时,最终会得到一个包含JSON数据的文件。我知道从该文件加载此模型的两种方法:

var loader = new THREE.JSONLoader()
var material = new THREE.MeshPhongMaterial({color: '#8080a0'})
一,

二,。编辑tower.js文件并添加

var tower = 
在第一行。然后,您可以加载以下内容:

var towerModel = loader.parse(tower)
var mesh = new THREE.Mesh(towerModel.geometry, material)
我更喜欢第二种解决方案,因为当您有数千个基于同一模型的网格时,每当您想要创建网格时,使用loader.load()函数非常慢,并且很容易杀死您的浏览器

所以我的问题是-我可以从tower.JSON文件中获取JSON数据到变量中,而不必手动编辑该文件吗?最好的解决方案是在不更改文件的情况下将JSON数据放入变量。

我选择选项1。 将加载程序添加到源文件听起来很奇怪。 为了保持整洁,如果您要求的话,您应该将加载程序和数据源(您的模型文件)分开

你为什么要重新加载同一个模型呢。您应该将其存储在变量中并重用它。两次加载相同的几何体是对CPU和内存的浪费

你可以很容易地做类似的事情来优化事情。这只是一个概念,但我希望你能理解:

// Storage for model files
myFiles = {
    tower: 'tower.json',
    car: 'car.json'
};

// Storage for loaded geometries
myModels = {
    tower: null,
    car: null
};

// Loader, loads only first time from file then from storage
var load = function( modelName ){
    if( myModels[modelName] === null ){
        loader.load(myFiles[modelName], function (geometry) {
            myModels[modelName] = geometry;
        });
    }

    var model = new THREE.Mesh(myModels[modelName], material)
    scene.add( model );
}

您可以按您认为最好的方式重新编写。

为什么不使用方法1加载一个几何体,然后从同一几何体创建所有网格?是否希望多个网格共享同一几何体?是的,这就是我需要的确定。从相同的几何体创建10个网格,并将每个网格添加到场景中。但是我必须在回调函数中创建它们,我不想这样做。我只有回调函数中的几何体,外部回调函数模型还不能加载。所以,如果你有一个循环,你会怎么做?你必须添加10000个一种类型的网格,3000个另一种类型的网格,5000个另一种类型的网格(来自3个不同的JSON文件)?我在哪里向一个源文件添加了加载程序?通过向JSON数据添加变量名,我将其更改为普通javascript文件。您的示例将不起作用,因为创建网格时没有可用的几何体,因为它没有时间加载。这就是为什么您必须在回调函数中创建网格。
// Storage for model files
myFiles = {
    tower: 'tower.json',
    car: 'car.json'
};

// Storage for loaded geometries
myModels = {
    tower: null,
    car: null
};

// Loader, loads only first time from file then from storage
var load = function( modelName ){
    if( myModels[modelName] === null ){
        loader.load(myFiles[modelName], function (geometry) {
            myModels[modelName] = geometry;
        });
    }

    var model = new THREE.Mesh(myModels[modelName], material)
    scene.add( model );
}