tunFace.threejs.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import * as THREE from 'three';
  2. import UseThree from '../../../../utils/threejs/useThree';
  3. import WorkFace from './tunFace.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, (intersects) => {});
  16. console.log('摄像头控制信息', model.orbitControls, model.camera);
  17. }
  18. };
  19. const addMouseEvent = () => {
  20. // 定义鼠标点击事件
  21. if (!model) return;
  22. model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  23. };
  24. const render = () => {
  25. if (model && model.isRender && model.renderer) {
  26. // model.animationId = requestAnimationFrame(render);
  27. model.css3dRender?.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  28. model.renderer.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  29. model.stats?.update();
  30. }
  31. };
  32. export const refreshModal = () => {
  33. if (fiberType === 'tunFace') {
  34. // workFaceObj.render();
  35. render();
  36. }
  37. };
  38. // 切换风窗类型
  39. export const setModelType = (type) => {
  40. if (!model) return;
  41. fiberType = type;
  42. return new Promise((resolve) => {
  43. if (fiberType === 'tunFace' && workFaceObj && workFaceObj.group) {
  44. group = workFaceObj.group;
  45. // const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  46. model?.orbitControls?.addEventListener('change', render);
  47. setTimeout(async () => {
  48. resolve(null);
  49. const oldCameraPosition = { x: -693, y: 474, z: 398 };
  50. if (!model?.scene?.getObjectByName('tunFace')) {
  51. model?.scene?.add(group);
  52. }
  53. const position = { x: 14.826074594663222, y: 16.901762713393836, z: 36.459944037951004 };
  54. await animateCamera(
  55. oldCameraPosition,
  56. { x: 0, y: 0, z: 0 },
  57. { x: position.x, y: position.y, z: position.z },
  58. { x: 0, y: 0, z: 0 },
  59. model,
  60. 0.8,
  61. render
  62. );
  63. }, 400);
  64. }
  65. });
  66. };
  67. export const mountedThree = () => {
  68. return new Promise(async (resolve) => {
  69. model = new UseThree('#tunFace3D', '#tunFace3DCSS');
  70. model.setEnvMap('test1');
  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. console.log('场景销毁前信息----------->', model.renderer?.info);
  85. workFaceObj?.destroy();
  86. workFaceObj = undefined;
  87. group = undefined;
  88. model.destroy();
  89. model = undefined;
  90. }
  91. };