首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ObjectLoader加载包含具有多个材料的BufferGeometry的JSON不起作用

使用ObjectLoader加载包含具有多个材料的BufferGeometry的JSON不起作用
EN

Stack Overflow用户
提问于 2019-06-20 02:28:20
回答 1查看 96关注 0票数 0

我已经创建了一个具有多种材质的球体,如下所示:

代码语言:javascript
复制
const materials = [
    new THREE.MeshPhongMaterial({});
    new THREE.ShaderMaterial({ visible: false});
]

const geometry = new THREE.SphereBufferGeometry(2,100,100);
geometry.addGroup(0, Infinity, 0);
geometry.addGroup(0, Infinity, 1);

const mesh = new THREE.Mesh(geometry, materials);
scene.add(mesh);

场景,灯光,相机也被定义(但不包括在这里,因为它们不是一个问题)。

当页面加载(初始化)时,这一切都会起作用。

稍后,我将使用scene.toJSON()导出整个场景。然后,稍后,我可能希望重新加载该JSON并替换整个场景。我这样做的原因是:

代码语言:javascript
复制
const loader = new THREE.ObjectLoader();
loader.parse(jsonObject, function(object) {

    // instance is an object containing a bunch of things,
    // including the current scene. 
    // So I replace the current scene with the new one from the JSON

    instance.scene = object;
}

此时,场景被正确替换,但对象没有出现(我知道JSON的格式正确)。

我已经尝试过了,而不是使用

代码语言:javascript
复制
const geometry = new THREE.SphereGeometry(2,100,100);

如果我这样做了,那么当加载JSON时,对象就会正确地出现。

我更喜欢使用SphereBufferGeometry(),但我不确定为什么它不能工作。我遗漏了什么/做错了什么?

这里有两个例子。在这两种情况下,您都应该看到一个空白球体,但在#1中您没有看到:

https://codepen.io/anon/pen/BgQmMq

  • With SphereBufferGeometry
  1. SphereBufferGeometrySphereGeometry
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 03:27:46

你的代码有两个问题。

  • 使用内置几何图形生成器时,three.js假定您不修改几何图形数据。但您实际上是通过添加组来做到这一点的。这些数据在序列化/反序列化过程中丢失。因此,我们的想法是创建一个新的BufferGeometry对象,并复制缓冲区属性和索引。然后你可以自由定义新的数据或者覆盖现有的数据。
  • 另外,Infinity不是一个好的选择,因为它不能被序列化。最好为非索引几何图形设置表示最后一个顶点的值,或者为索引几何图形设置表示最后一个索引的值。我已经用这两个修复更新了你的代码。

https://codepen.io/anon/pen/MMbQgv

three.js R105

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56673801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档