【问题标题】:How to assign to variable content of Three.js model file如何分配给 Three.js 模型文件的变量内容
【发布时间】:2015-01-23 16:55:03
【问题描述】:

当您将模型从 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一次加载几何,然后从同一个几何创建所有网格?
  • 您希望多个网格共享相同的几何体吗?
  • 是的,这就是我需要的
  • 好的。从相同的几何体创建 10 个网格,并将每个网格添加到场景中。
  • 但是我必须在我不想的回调函数中创建它们。我只有在回调函数中有几何,外部回调函数模型还不能加载。

标签: javascript json three.js


【解决方案1】:

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

你可以按照你认为最好的方式来修改它。

【讨论】:

  • 那么,如果您有一个循环,您将不得不添加 10000 个一种类型的网格和 3000 个另一种类型的网格以及 5000 个另一种类型的网格(来自 3 个不同的 JSON 文件),您会怎么做?
  • 我在哪里将加载器添加到源文件?我通过向 JSON 数据添加变量名将其更改为普通的 javascript 文件。
  • 您的示例将不起作用,因为在创建网格时没有可用的几何图形,因为它没有时间加载。这就是为什么你必须在回调函数中创建网格。
猜你喜欢
  • 2013-03-11
  • 2019-05-12
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多