This message peaked my interest: https://github.com/KhronosGroup/glTF/issues/1420#issuecomment-412297214
So I’ve tested this with my custom exporter that wrote a MaterialLibrary.gltf
. This file only contains the Asset
and Materials
properties. Another glTF with meshes will have it’s Material
(property of MeshPrimitive
) assigned an index as listed in the MaterialLibrary.gltf
.
But loading the files in either the editor or glTF viewer results in nothing happening or an object is undefined
error respectively.
Any help on how to apply a material library concept (i.e. sharing materials between multiple models)?
The editor and my viewer do expect each file to contain a model, but I think you can use THREE.GLTFLoader directly to do this. For example:
var loader = new THREE.GLTFLoader();
loader.load( 'MaterialLibrary.gltf', ( gltf ) => {
var parser = gltf.parser;
console.log(parser.json.materials); // glTF definitions of materials
parser.getDependency( 'material', 5 ).then(( material5 ) => {
console.log(material5); // THREE.MeshStandardMaterial
} );
}, undefined, (e) => console.error(e));
You may find it helpful to use userData (mesh.userData.*
) to associate things. GLTFLoader will populate .userData
on meshes and materials based on the .extras
glTF field.
Finally, note that there are certain cases where a glTF file containing 1 material may translate to a three.js model containing 2+ materials. See https://github.com/mrdoob/three.js/blob/r99/examples/js/loaders/GLTFLoader.js#L2812.
1 Like