I’m thinking about converting any type the user uploads into .gltf and load that ( mainly because threejs’ docs says “Where possible, we recommend using glTF” ), does that sound like a good, feasible solution?
Doing something like looeee does in his glTF converter where he loads both original format and in .gltf
format, but I’d just load the latter.
I’ve done this by uploading an .fbx
file, loading it with the npm pckg three-fbxloader-offical
's FBXLoader
and instead of adding the object to the scene, I’d use it on npm pckg three-gltf-exporter
's GLTFExporter
to parse it, create a blob
and then load it with npm pckg three-gltf-loader
(Note: all packages work great on their own, they do what they have to)
Since I’m actually loading the fbx
and then parsing it I’m not sure if it’s really helping performance-wise, but the .gltf
does look better so got that going for me.
So, within a React class I have:
imports (just the necessary for the question)
import React from 'react';
import * as THREE from 'three'; //0.103.0
import GLTFLoader from 'three-gltf-loader'; //1.103.0
import GLTFExporter from 'three-gltf-exporter'; //0.0.1
import FBXLoader from 'three-fbxloader-offical'; //1.0.0
The fbx
files loader (works great when adding to the scene)
loadFBX = source => {
const onLoad = function(object) {
this.mixer = new THREE.AnimationMixer(object);
const action = this.mixer.clipAction(object.animations[0]);
action.play();
// call this to convert to gtlf before adding to the scene
this.exportGLTF(object);
// this.scene.add(object);
}.bind(this);
const onLoaderError = error => {
console.log(error);
};
const loader = new FBXLoader(this.threeLoadingManager());
loader.load(source, onLoad, null, onLoaderError);
};
The glTF exporter function
exportGLTF = input => {
const gltfExporter = new GLTFExporter();
let output;
const options = {
trs: false,
onlyVisible: true,
truncateDrawRange: false,
binary: false,
forceIndices: false,
forcePowerOfTwoTextures: false
};
gltfExporter.parse(
input,
function(result) {
output = JSON.stringify(result, null, 2);
const blob = new Blob([output], { type: 'text/plain' });
output = URL.createObjectURL(blob);
this.loadGTLF(output);
}.bind(this),
options
);
};
And the glTF loader (works great when adding to the scene)
loadGTLF = source => {
const loader = new GLTFLoader();
loader.load(
source,
gltf => {
const model = gltf.scene;
this.mixer = new THREE.AnimationMixer(model);
gltf.animations.forEach(clip => {
this.mixer.clipAction(clip).play();
});
this.scene.add(model);
},
xhr => {
console.log(`${(xhr.loaded / xhr.total) * 100}% loaded`);
},
error => {
console.error('An error happened', error);
}
);
};
So the question is, is this worth it? Or should just load the .fbx
or any other format independently (I’m already using the respective loader so…)