You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
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<T = any> = (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<BaseModel>) {
|
|
this.gltfLoader.load(url, (gltf) => {
|
|
const baseModel = new BaseModel(gltf, this.viewer);
|
|
callback && callback(baseModel);
|
|
});
|
|
}
|
|
|
|
/**模型加载到场景 */
|
|
public loadModelToScene(url: string, callback: LoadModelCallbackFn<BaseModel>) {
|
|
this.loadModel(url, (model) => {
|
|
this.viewer.scene.add(model.object);
|
|
callback && callback(model);
|
|
});
|
|
}
|
|
}
|