fiber.threejs.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 { useAppStore } from '/@/store/modules/app';
  7. // 模型对象、 文字对象
  8. let model,
  9. beltFiberObj: BeltFiber,
  10. workerFaceFiberObj: WorkFace,
  11. group,
  12. fiberType = 'beltFiber'; // workerFaceFiber
  13. const appStore = useAppStore();
  14. // 鼠标点击、松开事件
  15. const mouseEvent = (event) => {
  16. event.stopPropagation();
  17. const widthScale = appStore.getWidthScale;
  18. const heightScale = appStore.getHeightScale;
  19. // 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
  20. model.mouse.x =
  21. ((-model.canvasContainer.getBoundingClientRect().left * widthScale + event.clientX) / (model.canvasContainer.clientWidth * widthScale)) * 2 - 1;
  22. model.mouse.y =
  23. -((-model.canvasContainer.getBoundingClientRect().top + event.clientY) / (model.canvasContainer.clientHeight * heightScale)) * 2 + 1;
  24. (model.rayCaster as THREE.Raycaster).setFromCamera(model.mouse, model.camera as THREE.Camera);
  25. if (group) {
  26. if (fiberType === 'beltFiber') {
  27. beltFiberObj.mousedownModel.call(beltFiberObj, model.rayCaster);
  28. } else if (fiberType === 'workFace') {
  29. workerFaceFiberObj.mousedownModel.call(workerFaceFiberObj, model.rayCaster);
  30. }
  31. // const intersects = model.rayCaster?.intersectObjects([...group.children]) as THREE.Intersection[];
  32. // if (intersects.length > 0) {
  33. // if (fiberType === 'beltFiber') {
  34. // beltFiberObj.mousedownModel.call(beltFiberObj, intersects);
  35. // } else if (fiberType === 'workFace') {
  36. // workerFaceFiberObj.mousedownModel.call(workerFaceFiberObj, intersects);
  37. // }
  38. // }
  39. }
  40. };
  41. const addMouseEvent = () => {
  42. // 定义鼠标点击事件
  43. model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  44. model.canvasContainer?.addEventListener('pointerup', (event) => {
  45. event.stopPropagation();
  46. // 单道、 双道
  47. if (fiberType === 'beltFiber') {
  48. beltFiberObj.mouseUpModel.call(beltFiberObj);
  49. } else if (fiberType === 'workFace') {
  50. workerFaceFiberObj.mouseUpModel.call(workerFaceFiberObj);
  51. }
  52. });
  53. };
  54. const render = () => {
  55. if (model.animationId != -1) {
  56. model.animationId = requestAnimationFrame(render);
  57. model.css3dRender?.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  58. model.stats?.update();
  59. }
  60. };
  61. export const refreshModal = (warningNum, errorNum) => {
  62. if (fiberType === 'beltFiber') {
  63. beltFiberObj.monitorData(warningNum, errorNum);
  64. beltFiberObj.render();
  65. } else if (fiberType === 'workFace') {
  66. workerFaceFiberObj.render();
  67. }
  68. };
  69. export const addFiberText = (selectData) => {
  70. if (fiberType === 'beltFiber') {
  71. return beltFiberObj.addBeltText.call(beltFiberObj, selectData);
  72. }
  73. if (fiberType === 'workFace') {
  74. return workerFaceFiberObj.addMonitorText.call(workerFaceFiberObj, selectData);
  75. }
  76. };
  77. // 切换风窗类型
  78. export const setModelType = (type) => {
  79. fiberType = type;
  80. return new Promise((resolve) => {
  81. if (fiberType === 'beltFiber') {
  82. group = beltFiberObj.group;
  83. if (model.scene.getObjectByName('workFace')) {
  84. model.scene.remove(workerFaceFiberObj.group);
  85. }
  86. const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  87. model.scene.add(beltFiberObj.group);
  88. model.orbitControls.addEventListener('change', beltFiberObj.render.bind(beltFiberObj));
  89. setTimeout(async () => {
  90. resolve(null);
  91. const position = { x: 0, y: 3.8, z: 10.5 };
  92. await animateCamera(
  93. oldCameraPosition,
  94. oldCameraPosition,
  95. { x: position.x, y: position.y, z: position.z },
  96. { x: 10, y: 3.1, z: -8.8 },
  97. model,
  98. 0.8,
  99. beltFiberObj.render.bind(beltFiberObj)
  100. );
  101. }, 300);
  102. }
  103. if (fiberType === 'workFace') {
  104. group = workerFaceFiberObj.group;
  105. if (model.scene.getObjectByName('beltFiber')) {
  106. model.scene.remove(beltFiberObj.group);
  107. }
  108. const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  109. model.scene.add(workerFaceFiberObj.group);
  110. model.orbitControls.addEventListener('change', workerFaceFiberObj.render.bind(workerFaceFiberObj));
  111. setTimeout(async () => {
  112. resolve(null);
  113. const position = { x: 0, y: 3.8, z: 1.5 };
  114. await animateCamera(
  115. oldCameraPosition,
  116. oldCameraPosition,
  117. { x: position.x, y: position.y, z: position.z },
  118. { x: 10, y: 3.1, z: -8.8 },
  119. model,
  120. 0.8,
  121. workerFaceFiberObj.render.bind(workerFaceFiberObj)
  122. );
  123. }, 300);
  124. }
  125. });
  126. };
  127. export const mountedThree = () => {
  128. return new Promise(async (resolve) => {
  129. model = new UseThree('#fiberBox', '#fiber3DCSS');
  130. model.setEnvMap('test1');
  131. model.renderer.toneMappingExposure = 1;
  132. model.camera.position.set(100, 0, 1000);
  133. beltFiberObj = new BeltFiber(model);
  134. await beltFiberObj.mountedThree();
  135. workerFaceFiberObj = new WorkFace(model);
  136. await workerFaceFiberObj.mountedThree();
  137. addMouseEvent()
  138. render();
  139. resolve(null);
  140. });
  141. };
  142. export const destroy = () => {
  143. if (model) {
  144. beltFiberObj.destroy();
  145. model.deleteModal();
  146. model = null;
  147. group = null;
  148. beltFiberObj = null;
  149. }
  150. };