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

时间:2015-01-23 04:36:41

标签: javascript json three.js

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

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

1

loader.load('tower.json', function (geometry) {
    var mesh = new THREE.Mesh(geometry, material)
})

2。编辑tower.js文件并添加

var tower = 

在第一行。然后你可以用:

加载它
var towerModel = loader.parse(tower)
var mesh = new THREE.Mesh(towerModel.geometry, material)

我更喜欢第二个解决方案,因为每当你想要创建一个网格时,如果你有基于相同模型的数千个网格,那么使用loader.load()函数非常慢,很容易杀死你的浏览器。

所以我的问题是 - 我可以将tower.json文件中的JSON数据转换为变量而无需手动编辑文件吗?最好的解决方案是将JSON数据放入变量而不对文件进行更改。

1 个答案:

答案 0 :(得分:0)

我会选择选项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 );
}

你可以重新思考你认为最好的方式。