tunFace.threejs.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 { useAppStore } from '/@/store/modules/app';
  6. // 模型对象、 文字对象
  7. let model,
  8. workFaceObj: WorkFace,
  9. group,
  10. fiberType = 'tunFace'; // workerFaceFiber
  11. const appStore = useAppStore();
  12. // 鼠标点击、松开事件
  13. const mouseEvent = (event) => {
  14. event.stopPropagation();
  15. const widthScale = appStore.getWidthScale;
  16. const heightScale = appStore.getHeightScale;
  17. // 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
  18. model.mouse.x =
  19. ((-model.canvasContainer.getBoundingClientRect().left * widthScale + event.clientX) / (model.canvasContainer.clientWidth * widthScale)) * 2 - 1;
  20. model.mouse.y =
  21. -((-model.canvasContainer.getBoundingClientRect().top + event.clientY) / (model.canvasContainer.clientHeight * heightScale)) * 2 + 1;
  22. (model.rayCaster as THREE.Raycaster).setFromCamera(model.mouse, model.camera as THREE.Camera);
  23. if (group) {
  24. // if (fiberType === 'tunFace') {
  25. // workFaceObj.mousedownModel.call(workFaceObj, model.rayCaster);
  26. // }
  27. console.log(model.camera, model.orbitControls);
  28. // const intersects = model.rayCaster?.intersectObjects([...group.children]) as THREE.Intersection[];
  29. // if (intersects.length > 0) {
  30. // if (fiberType === 'beltFiber') {
  31. // beltFiberObj.mousedownModel.call(beltFiberObj, intersects);
  32. // } else if (fiberType === 'tunFace') {
  33. // workFaceObj.mousedownModel.call(workFaceObj, intersects);
  34. // }
  35. // }
  36. }
  37. };
  38. const addMouseEvent = () => {
  39. // 定义鼠标点击事件
  40. model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  41. model.canvasContainer?.addEventListener('pointerup', (event) => {
  42. event.stopPropagation();
  43. // if (fiberType === 'tunFace') {
  44. // workFaceObj.mouseUpModel.call(workFaceObj);
  45. // }
  46. });
  47. };
  48. const render = () => {
  49. if (model && model.animationId != -1) {
  50. // model.animationId = requestAnimationFrame(render);
  51. model.css3dRender?.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  52. model.renderer.render(model.scene as THREE.Scene, model.camera as THREE.PerspectiveCamera);
  53. model.stats?.update();
  54. }
  55. };
  56. export const refreshModal = () => {
  57. if (fiberType === 'tunFace') {
  58. // workFaceObj.render();
  59. render();
  60. }
  61. };
  62. // 切换风窗类型
  63. export const setModelType = (type) => {
  64. fiberType = type;
  65. return new Promise((resolve) => {
  66. if (fiberType === 'tunFace' && workFaceObj) {
  67. group = workFaceObj.group;
  68. // const oldCameraPosition = { x: 124.736, y: 63.486, z: 103.337 };
  69. const oldCameraPosition = { x: 124.736, y: 63.486, z: 603.337 };
  70. if (!model.scene.getObjectByName('tunFace')) {
  71. model.scene.add(workFaceObj.group);
  72. }
  73. model.orbitControls.addEventListener('change', render);
  74. setTimeout(async () => {
  75. resolve(null);
  76. const position = { x: 14.826074594663222, y: 16.901762713393836, z: 36.459944037951004 };
  77. await animateCamera(
  78. oldCameraPosition,
  79. { x: 0, y: 0, z: 0 },
  80. { x: position.x, y: position.y, z: position.z },
  81. { x: 0, y: 0, z: 0 },
  82. model,
  83. 0.8,
  84. render
  85. );
  86. }, 400);
  87. }
  88. });
  89. };
  90. export const mountedThree = () => {
  91. return new Promise(async (resolve) => {
  92. model = new UseThree('#tunFace3D', '#tunFace3DCSS');
  93. model.setEnvMap('test1');
  94. model.renderer.toneMappingExposure = 1;
  95. model.camera.position.set(100, 0, 1000);
  96. workFaceObj = new WorkFace(model);
  97. await workFaceObj.mountedThree();
  98. addMouseEvent();
  99. render();
  100. resolve(null);
  101. });
  102. };
  103. export const destroy = () => {
  104. if (model) {
  105. workFaceObj.destroy();
  106. model.deleteModal();
  107. model = null;
  108. group = null;
  109. workFaceObj = null;
  110. }
  111. };