fiber.threejs.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import * as THREE from 'three';
  2. import UseThree from '../../../../utils/threejs/useThree';
  3. import BeltFiber from './fiber.belt.threejs';
  4. import WorkFace from './fiber.workFace.threejs';
  5. import { animateCamera } from '/@/utils/threejs/util';
  6. import useEvent from '../../../../utils/threejs/useEvent';
  7. // 模型对象、 文字对象
  8. let model: UseThree | undefined,
  9. beltFiberObj: BeltFiber | undefined,
  10. workerFaceFiberObj: WorkFace | undefined,
  11. group: THREE.Object3D | undefined,
  12. fiberType = 'beltFiber'; // workerFaceFiber
  13. const { mouseDownFn } = useEvent();
  14. // 鼠标点击、松开事件
  15. const mouseEvent = (event) => {
  16. if (event.button == 0) {
  17. mouseDownFn(<UseThree>model, <THREE.Object3D>group, event, (intersects) => {
  18. if (fiberType === 'beltFiber') {
  19. // beltFiberObj?.mousedownModel.call(beltFiberObj, model.rayCaster);
  20. } else if (fiberType === 'workFace') {
  21. // workerFaceFiberObj.mousedownModel.call(workerFaceFiberObj, model.rayCaster);
  22. }
  23. });
  24. console.log('摄像头控制信息', model?.orbitControls, model?.camera);
  25. }
  26. };
  27. const addMouseEvent = () => {
  28. // 定义鼠标点击事件
  29. model?.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  30. model?.canvasContainer?.addEventListener('pointerup', (event) => {
  31. event.stopPropagation();
  32. // 单道、 双道
  33. if (fiberType === 'beltFiber') {
  34. beltFiberObj?.mouseUpModel.call(beltFiberObj);
  35. } else if (fiberType === 'workFace') {
  36. workerFaceFiberObj?.mouseUpModel.call(workerFaceFiberObj);
  37. }
  38. });
  39. };
  40. const render = () => {
  41. if (model && model.isRender) {
  42. model.animationId = requestAnimationFrame(render);
  43. model.css3dRender?.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  44. model.stats?.update();
  45. }
  46. };
  47. export const refreshModal = (warningNum, errorNum) => {
  48. if (fiberType === 'beltFiber') {
  49. beltFiberObj?.monitorData(warningNum, errorNum);
  50. beltFiberObj?.render();
  51. } else if (fiberType === 'workFace') {
  52. workerFaceFiberObj?.render();
  53. }
  54. };
  55. export const addFiberText = (selectData) => {
  56. if (fiberType === 'beltFiber') {
  57. return beltFiberObj?.addBeltText.call(beltFiberObj, selectData);
  58. }
  59. if (fiberType === 'workFace') {
  60. return workerFaceFiberObj?.addMonitorText.call(workerFaceFiberObj, selectData);
  61. }
  62. };
  63. // 切换风窗类型
  64. export const setModelType = (type) => {
  65. fiberType = type;
  66. return new Promise((resolve) => {
  67. if (fiberType === 'beltFiber' && beltFiberObj && beltFiberObj.group) {
  68. group = beltFiberObj.group;
  69. if (model?.scene?.getObjectByName('workFace') && workerFaceFiberObj) {
  70. model?.scene.remove(workerFaceFiberObj.group);
  71. }
  72. const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  73. model?.scene?.add(beltFiberObj.group);
  74. model?.orbitControls?.addEventListener('change', beltFiberObj.render.bind(beltFiberObj));
  75. setTimeout(async () => {
  76. resolve(null);
  77. const position = { x: 0, y: 3.8, z: 10.5 };
  78. await animateCamera(
  79. oldCameraPosition,
  80. { x: 0, y: 0, z: 0 },
  81. { x: position.x, y: position.y, z: position.z },
  82. { x: 10, y: 3.1, z: -8.8 },
  83. model,
  84. 0.8,
  85. beltFiberObj?.render.bind(beltFiberObj)
  86. );
  87. }, 300);
  88. }
  89. if (fiberType === 'workFace' && workerFaceFiberObj && workerFaceFiberObj.group) {
  90. group = workerFaceFiberObj.group;
  91. if (model?.scene?.getObjectByName('beltFiber') && beltFiberObj) {
  92. model.scene.remove(beltFiberObj.group);
  93. }
  94. const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  95. model?.scene?.add(workerFaceFiberObj.group);
  96. model?.orbitControls?.addEventListener('change', workerFaceFiberObj.render.bind(workerFaceFiberObj));
  97. setTimeout(async () => {
  98. resolve(null);
  99. const position = { x: 0, y: 3.8, z: 1.5 };
  100. await animateCamera(
  101. oldCameraPosition,
  102. { x: 0, y: 0, z: 0 },
  103. { x: position.x, y: position.y, z: position.z },
  104. { x: 10, y: 3.1, z: -8.8 },
  105. model,
  106. 0.8,
  107. workerFaceFiberObj?.render.bind(workerFaceFiberObj)
  108. );
  109. }, 300);
  110. }
  111. });
  112. };
  113. export const mountedThree = () => {
  114. return new Promise(async (resolve) => {
  115. model = new UseThree('#fiberBox', '#fiber3DCSS');
  116. model.setEnvMap('test1.hdr');
  117. model?.camera?.position.set(100, 0, 1000);
  118. beltFiberObj = new BeltFiber(model);
  119. await beltFiberObj.mountedThree();
  120. workerFaceFiberObj = new WorkFace(model);
  121. await workerFaceFiberObj.mountedThree();
  122. addMouseEvent();
  123. render();
  124. resolve(null);
  125. });
  126. };
  127. export const destroy = () => {
  128. if (model) {
  129. model.isRender = false;
  130. console.log('场景销毁前信息----------->', model.renderer?.info);
  131. beltFiberObj?.destroy();
  132. beltFiberObj = undefined;
  133. workerFaceFiberObj?.destroy();
  134. workerFaceFiberObj = undefined;
  135. group = undefined;
  136. model.destroy();
  137. model = undefined;
  138. }
  139. };