当您将模型从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数据放入变量而不对文件进行更改。
答案 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 );
}
你可以重新思考你认为最好的方式。