resource.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { Box3, Color, MeshStandardMaterial, Object3D, Vector3 } from "three";
  2. import { GLTFLoader } from "three/examples/jsm/Addons.js";
  3. const gltfLoader = new GLTFLoader().setPath("/static/models/");
  4. const normalized = async (model: Object3D) => {
  5. const parent = new Object3D();
  6. parent.add(model);
  7. const bbox = new Box3().setFromObject(parent);
  8. const size = bbox.getSize(new Vector3());
  9. parent.scale.set(1 / size.x, 1 / size.y, 1 / size.z);
  10. model.traverse((child: any) => {
  11. if (child.isMesh) {
  12. child.receiveShadow = true;
  13. child.castShadow = true;
  14. }
  15. });
  16. const center = new Box3().setFromObject(parent).getCenter(new Vector3());
  17. parent.position.sub({ x: center.x, y: center.y, z: center.z });
  18. return parent;
  19. };
  20. const resources: Record<string, () => Promise<Object3D>> = {
  21. "men_l.svg": async () => {
  22. const gltf = await gltfLoader.loadAsync("door_with_frame/scene.gltf");
  23. return await normalized(gltf.scene);
  24. },
  25. "piaochuang.svg": async () => {
  26. const gltf = await gltfLoader.loadAsync("window/scene.gltf");
  27. // gltf.scene.rotateY(Math.PI / 2);
  28. gltf.scene.traverse((node: any) => {
  29. if (node.name === '02') {
  30. node.parent.remove(node)
  31. }
  32. })
  33. return await normalized(gltf.scene);
  34. },
  35. "chuang.svg": () => {
  36. return getModel('piaochuang.svg') as Promise<Object3D>
  37. }
  38. };
  39. export const getModel = (() => {
  40. const typeModels: Record<string, Promise<Object3D | undefined>> = {};
  41. return (type: string) => {
  42. const ndx = type.lastIndexOf("/");
  43. if (~ndx) {
  44. type = type.substring(ndx + 1);
  45. }
  46. if (type in typeModels) {
  47. return typeModels[type];
  48. }
  49. if (type in resources) {
  50. typeModels[type] = resources[type]();
  51. typeModels[type].catch(() => {
  52. delete typeModels[type];
  53. });
  54. return typeModels[type];
  55. }
  56. };
  57. })();