2019-01-28 19:39:59 +08:00

55 lines
1.7 KiB
JavaScript

import BaseLoader from './BaseLoader';
/**
* FBXLoader
* @author tengge / https://github.com/tengge1
*/
function FBXLoader() {
BaseLoader.call(this);
}
FBXLoader.prototype = Object.create(BaseLoader.prototype);
FBXLoader.prototype.constructor = FBXLoader;
FBXLoader.prototype.load = function (url, options) {
return new Promise(resolve => {
this.require('FBXLoader').then(() => {
var loader = new THREE.FBXLoader();
loader.load(url, obj3d => {
Object.assign(obj3d.userData, {
obj: obj3d,
root: obj3d,
});
if (obj3d.animations && obj3d.animations.length > 0) {
Object.assign(obj3d.userData, {
animNames: obj3d.animations.map(n => n.name),
scripts: [{
id: null,
name: `${options.Name}${L_ANIMATION}`,
type: 'javascript',
source: this.createScripts(options.Name),
uuid: THREE.Math.generateUUID()
}]
});
}
resolve(obj3d);
}, undefined, () => {
resolve(null);
});
});
});
};
FBXLoader.prototype.createScripts = function (name) {
return `var mesh = this.getObjectByName('${name}');\n\n` +
`var obj = mesh.userData.obj;\n\n` +
`var root = mesh.userData.root;\n\n` +
`var mixer = new THREE.AnimationMixer(root);\n\n` +
`mixer.clipAction(obj.animations[0]).play();\n\n` +
`function update(clock, deltaTime) { \n mixer.update(deltaTime); \n}`;
};
export default FBXLoader;