import type Viewer from "../Viewer"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js"; import BaseModel from "../BaseModel"; type LoadModelCallbackFn = (arg: T) => any; /**模型加载器 */ export default class ModelLoder { protected viewer: Viewer; private gltfLoader: GLTFLoader; private readonly dracoLoader: DRACOLoader; constructor(viewer: Viewer, dracolPath = "/draco/") { this.viewer = viewer; this.gltfLoader = new GLTFLoader(); this.dracoLoader = new DRACOLoader(); // 提供一个DracLoader实例来解码压缩网格数据 // 没有这个会报错 dracolPath 默认放在public文件夹当中 this.dracoLoader.setDecoderPath(dracolPath); this.gltfLoader.setDRACOLoader(this.dracoLoader); } private loadModel(url: string, callback: LoadModelCallbackFn) { this.gltfLoader.load(url, (gltf) => { const baseModel = new BaseModel(gltf, this.viewer); callback && callback(baseModel); }); } /**模型加载到场景 */ public loadModelToScene(url: string, callback: LoadModelCallbackFn) { this.loadModel(url, (model) => { this.viewer.scene.add(model.object); callback && callback(model); }); } }