load(url, options) {
        return new Promise(resolve => {
            this.require('ColladaLoader').then(() => {
                var loader = new THREE.ColladaLoader();

                loader.load(url, collada => {
                    var dae = collada.scene;

                    dae.traverse(child => {
                        if (child instanceof THREE.Mesh) {
                            child.material.flatShading = true;
                        }
                        if (child.isSkinnedMesh) {
                            child.frustumCulled = false;
                        }
                    });

                    if (isNaN(dae.scale.x) || isNaN(dae.scale.y) || isNaN(dae.scale.z)) {
                        dae.scale.x = dae.scale.y = dae.scale.z = 10.0;
                        dae.updateMatrix();
                    }

                    dae._obj = collada;
                    dae._root = dae;

                    if (collada.animations && collada.animations.length > 0) {
                        Object.assign(dae.userData, {
                            animNames: collada.animations.map(n => n.name),
                            scripts: [{
                                id: null,
                                name: `${options.Name}${_t('Animation')}`,
                                type: 'javascript',
                                source: this.createScripts(options.Name),
                                uuid: THREE.Math.generateUUID()
                            }]
                        });
                    }

                    resolve(dae);
                }, undefined, () => {
                    resolve(null);
                });
            });
        });
    }
ColladaLoader
@author tengge / https://github.com/tengge1