Javascript 管理threejs几何体的元数据

Javascript 管理threejs几何体的元数据,javascript,three.js,Javascript,Three.js,我有三个.js几何体的元数据。链接此元数据的最佳方式是什么,因为没有可以将其直接存储在对象本身中的属性?您可以将用户数据存储在Object.userData对象中 编辑:有人指出几何图形没有用户数据 但是用户数据仍然可以被使用,并且将被序列化,因此可能需要遵循 myScene.userData.geometryMetas={} and then populate with myScene.userData.geometryMetas[geometry.uuid]=YourMetaData 您可

我有三个.js几何体的元数据。链接此元数据的最佳方式是什么,因为没有可以将其直接存储在对象本身中的属性?

您可以将用户数据存储在Object.userData对象中

编辑:有人指出几何图形没有用户数据

但是用户数据仍然可以被使用,并且将被序列化,因此可能需要遵循

myScene.userData.geometryMetas={}
and then populate with myScene.userData.geometryMetas[geometry.uuid]=YourMetaData

您可以将用户数据存储在Object.userData对象中

编辑:有人指出几何图形没有用户数据

但是用户数据仍然可以被使用,并且将被序列化,因此可能需要遵循

myScene.userData.geometryMetas={}
and then populate with myScene.userData.geometryMetas[geometry.uuid]=YourMetaData

你有三个选择

1.猴子修补术 只需将属性属性直接添加到three.js对象中

var myGeom = new THREE.Geometry();
myGeom.Attributes = Metadata;
这样做的优点是快速简单。它的缺点是黑客和脆弱,就像猴子补丁一样,而且元数据不会包含在几何体的toJSON方法中,这可能是您想要的,也可能不是您想要的

2.包装 只需将几何体包装到具有其自身属性的新对象中即可。可以使用普通对象:

var myGeom = {
    geometry: new THREE.Geometry(),
    attributes: Metadata
};
或创建构造函数:

function MyGeom(geometry, attributes) {
    this.geometry = geometry;
    this.attributes = attributes;
}
var myGeom = new MyGeom(new THREE.Geometry, Metadata);
缺点是,只要携带三个.Geometry对象,现在就必须使用包装的对象,并在调用THREE.js API时将其展开,然后重新包装从中获得的任何内容

3.保持元数据分离 每三个.Geometry对象都有一个唯一的uuid属性。您可以将此uuid用作单独元数据对象中的键,并且仍然只使用常规的Three.js对象

var AllMetadata = {}; // Should be global or assigned to a project namespace
var myGeom = new THREE.Geometry();
AllMetadata[myGeom.uuid] = Metadata;

通过这种方式,您不必通过几何图形传递属性数据,但当您确实需要时,它是可用的。

您有三个选项

1.猴子修补术 只需将属性属性直接添加到three.js对象中

var myGeom = new THREE.Geometry();
myGeom.Attributes = Metadata;
这样做的优点是快速简单。它的缺点是黑客和脆弱,就像猴子补丁一样,而且元数据不会包含在几何体的toJSON方法中,这可能是您想要的,也可能不是您想要的

2.包装 只需将几何体包装到具有其自身属性的新对象中即可。可以使用普通对象:

var myGeom = {
    geometry: new THREE.Geometry(),
    attributes: Metadata
};
或创建构造函数:

function MyGeom(geometry, attributes) {
    this.geometry = geometry;
    this.attributes = attributes;
}
var myGeom = new MyGeom(new THREE.Geometry, Metadata);
缺点是,只要携带三个.Geometry对象,现在就必须使用包装的对象,并在调用THREE.js API时将其展开,然后重新包装从中获得的任何内容

3.保持元数据分离 每三个.Geometry对象都有一个唯一的uuid属性。您可以将此uuid用作单独元数据对象中的键,并且仍然只使用常规的Three.js对象

var AllMetadata = {}; // Should be global or assigned to a project namespace
var myGeom = new THREE.Geometry();
AllMetadata[myGeom.uuid] = Metadata;

通过这种方式,您不必通过几何图形传递属性数据,但当您确实需要它时,它是可用的。

无论何时将属性添加到Object3D或任何子类上,您都有可能遇到冲突。.属性是一个糟糕的选择,因为几何图形上已经有了。.属性。另一个答案是正确的。无论何时将属性拍打到Object3D或任何子类上,都有可能发生冲突。.属性是一个糟糕的选择,因为几何体上已经有了。.属性。另一个答案是正确的。@Ipon没有特别询问缓冲区几何体。三.几何体没有userData属性。@Ipon没有特别询问BufferGeometry。几何体没有userData属性。