dedust.threejs.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import * as THREE from 'three';
  2. import UseThree from '../../../../utils/threejs/useThree';
  3. import WorkFace from './dedust.threejs.base';
  4. import { animateCamera } from '/@/utils/threejs/util';
  5. import useEvent from '../../../../utils/threejs/useEvent';
  6. // 模型对象、 文字对象
  7. let model: UseThree | undefined,
  8. workFaceObj: WorkFace | undefined,
  9. group: THREE.Object3D | undefined,
  10. fiberType = 'tunFace'; // workerFaceFiber
  11. const { mouseDownFn } = useEvent();
  12. // 鼠标点击、松开事件
  13. const mouseEvent = (event) => {
  14. if (event.button == 0 && model && group) {
  15. mouseDownFn(model, group, event, () => {});
  16. }
  17. };
  18. const addMouseEvent = () => {
  19. // 定义鼠标点击事件
  20. if (!model) return;
  21. model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  22. };
  23. const render = () => {
  24. if (model && model.isRender && model.renderer) {
  25. // model.animationId = requestAnimationFrame(render);
  26. model.css3dRender?.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  27. model.renderer.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  28. model.stats?.update();
  29. }
  30. };
  31. export const refreshModal = () => {
  32. if (fiberType === 'tunFace') {
  33. // workFaceObj.render();
  34. render();
  35. }
  36. };
  37. // 切换风窗类型
  38. export const setModelType = (type) => {
  39. if (!model) return;
  40. fiberType = type;
  41. return new Promise((resolve) => {
  42. if (fiberType === 'tunFace' && workFaceObj && workFaceObj.group) {
  43. group = workFaceObj.group;
  44. // const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  45. model?.orbitControls?.addEventListener('change', render);
  46. setTimeout(async () => {
  47. resolve(null);
  48. const oldCameraPosition = { x: -693, y: 474, z: 398 };
  49. if (!model?.scene?.getObjectByName('tunFace') && group) {
  50. model?.scene?.add(group);
  51. }
  52. const position = { x: 14.826074594663222, y: 16.901762713393836, z: 36.459944037951004 };
  53. await animateCamera(
  54. oldCameraPosition,
  55. { x: 0, y: 0, z: 0 },
  56. { x: position.x, y: position.y, z: position.z },
  57. { x: 0, y: 0, z: 0 },
  58. model,
  59. 0.8,
  60. render
  61. );
  62. }, 400);
  63. }
  64. });
  65. };
  66. export const mountedThree = () => {
  67. return new Promise(async (resolve) => {
  68. model = new UseThree('#tunFace3D', '#tunFace3DCSS');
  69. model.setEnvMap('test1.hdr');
  70. /** @ts-ignore-next-line */
  71. model.renderer.toneMappingExposure = 1.0;
  72. // model?.camera?.position.set(100, 0, 1000);
  73. workFaceObj = new WorkFace(model);
  74. await workFaceObj.mountedThree();
  75. addMouseEvent();
  76. // render();
  77. model.animate();
  78. resolve(null);
  79. });
  80. };
  81. export const destroy = () => {
  82. if (model) {
  83. model.isRender = false;
  84. workFaceObj?.destroy();
  85. workFaceObj = undefined;
  86. group = undefined;
  87. model.destroy();
  88. model = undefined;
  89. }
  90. };