nitrogen.threejs.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import * as THREE from 'three';
  2. import { animateCamera, setModalCenter, updateAxisCenter } from '/@/utils/threejs/util';
  3. import UseThree from '../../../../utils/threejs/useThree';
  4. import useEvent from '../../../../utils/threejs/useEvent';
  5. import Nitrogen from './nitrogen.dishang.threejs';
  6. import { modal } from 'vxe-table';
  7. // import * as dat from 'dat.gui';
  8. // const gui = new dat.GUI();
  9. // gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
  10. // 模型对象、 文字对象
  11. let model: UseThree | undefined,
  12. group: THREE.Object3D | undefined,
  13. // compressorObj: Nitrogen | undefined,
  14. modalType = 'compressor1';
  15. const compressorObjArr = <Nitrogen[] | undefined[]>[];
  16. const { mouseDownFn, mousemoveFn, mouseUpFn } = useEvent();
  17. // 鼠标点击、松开事件
  18. const mouseEvent = (event) => {
  19. // 单道、 双道
  20. if (event.button == 0 && model && group) {
  21. model.canvasContainer?.addEventListener('mousemove', mousemove);
  22. mouseDownFn(model, group, event, (intersects) => {
  23. compressorObjArr.forEach((compressorObj, index) => {
  24. if (modalType === 'compressor' + index) {
  25. compressorObj?.mousedownModel.call(compressorObj, intersects);
  26. }
  27. });
  28. console.log('摄像头控制信息', model?.orbitControls, model?.camera);
  29. });
  30. }
  31. };
  32. const mouseUp = () => {
  33. if (!model) return;
  34. mouseUpFn(model);
  35. model.canvasContainer?.removeEventListener('mousemove', mousemove);
  36. };
  37. const mousemove = () => {
  38. mousemoveFn();
  39. };
  40. const render = () => {
  41. if (model && model.isRender) {
  42. model.animationId = requestAnimationFrame(render.bind(this));
  43. model.stats?.update();
  44. if (model.renderEnabled) {
  45. model.render();
  46. }
  47. }
  48. };
  49. /* 添加监控数据 */
  50. export const addText = () => {
  51. if (!compressorObj) return;
  52. };
  53. // 切换风窗类型
  54. export const setModelType = (modalTypeName) => {
  55. modalType = modalTypeName;
  56. if (group) {
  57. model?.scene?.remove(group);
  58. // model?.initCSS3Renderer('#compressorCss3D');
  59. }
  60. let compressorObj;
  61. compressorObjArr.forEach((compressor, index) => {
  62. if (modalTypeName === 'compressor' + index) {
  63. compressorObj = compressor;
  64. if (!compressor.CSSCanvasContainer?.contains(compressor.css3dRender.domElement))
  65. compressor.CSSCanvasContainer?.appendChild(compressor.css3dRender.domElement);
  66. } else {
  67. if (compressor.CSSCanvasContainer?.contains(compressor.css3dRender.domElement))
  68. compressor.CSSCanvasContainer?.removeChild(compressor.css3dRender.domElement);
  69. }
  70. });
  71. model.renderAnimationScene = () => {
  72. compressorObj?.css3dRender?.render(model?.scene as THREE.Scene, model?.camera as THREE.PerspectiveCamera);
  73. };
  74. return new Promise((resolve) => {
  75. group = compressorObj.group;
  76. model?.camera?.position.set(-1000, 100, 500);
  77. const oldCameraPosition = { x: -1000, y: 100, z: 500 };
  78. const oldControlsPosition = { x: 0, y: 0, z: 0 };
  79. let newCameraPosition = { x: 0, y: 0, z: 0 },
  80. newControlsPosition = { x: 0, y: 0, z: 0 };
  81. if (group?.children.length == 6) {
  82. newCameraPosition = { x: -107.33215442283758, y: 44.57609039633937, z: 2.0459979417299334 };
  83. newControlsPosition = { x: -4.615459422837561, y: -16.819491603660634, z: 1.9862299417299336 };
  84. } else if (group?.children.length == 5) {
  85. newCameraPosition = { x: -107.33215442283758, y: 44.57609039633937, z: 2.0459979417299334 };
  86. newControlsPosition = { x: -4.615459422837561, y: -16.819491603660634, z: 1.9862299417299336 };
  87. } else if (group?.children.length == 4) {
  88. newCameraPosition = { x: -2.0540155219473597, y: 40.869414434737195, z: 97.8637568969557 };
  89. newControlsPosition = { x: -2.01631417107236, y: -9.544836585137801, z: 8.50481206883075 };
  90. } else if (group?.children.length == 3) {
  91. newCameraPosition = { x: -0.8949900855095378, y: 44.03213312648178, z: 78.19288289339097 };
  92. newControlsPosition = { x: -0.4945087067301434, y: -9.810777468925817, z: -3.179982369050871 };
  93. } else if (group?.children.length == 2) {
  94. newCameraPosition = { x: -1.2741159124866441, y: 46.04318455197148, z: 70.25814325750986 };
  95. newControlsPosition = { x: -1.699431, y: -12.38981, z: -1.699431 };
  96. } else if (group?.children.length == 1) {
  97. newCameraPosition = { x: -1.2741159124866441, y: 46.04318455197148, z: 70.25814325750986 };
  98. newControlsPosition = { x: -1.699431, y: -12.38981, z: -1.699431 };
  99. }
  100. setTimeout(async () => {
  101. resolve(null);
  102. if (group) model?.scene?.add(group);
  103. await animateCamera(oldCameraPosition, oldControlsPosition, newCameraPosition, newControlsPosition, model, 0.8);
  104. }, 300);
  105. });
  106. };
  107. export const mountedThree = (monitorDataGroupArr) => {
  108. return new Promise(async (resolve) => {
  109. model = new UseThree('#compressor3D');
  110. model.setEnvMap('test1');
  111. model.renderer.toneMappingExposure = 1.0;
  112. model.camera?.layers.enable(0);
  113. model.canvasContainer?.addEventListener('mousedown', mouseEvent);
  114. model.canvasContainer?.addEventListener('pointerup', mouseUp);
  115. for (let i = 0; i < monitorDataGroupArr.length; i++) {
  116. const monitorDataGroup = monitorDataGroupArr[i];
  117. const compressorObj = new Nitrogen(model);
  118. await compressorObj.mountedThree(monitorDataGroup, '#compressorCss3D' + (i + 1));
  119. compressorObj.modelName = 'compressor' + (i + 1);
  120. compressorObjArr.push(compressorObj);
  121. }
  122. resolve(null);
  123. model.animate();
  124. });
  125. };
  126. export const destroy = () => {
  127. if (model) {
  128. model.isRender = false;
  129. console.log('场景销毁前信息----------->', model.renderer?.info);
  130. compressorObjArr.forEach((compressorObj) => {
  131. compressorObj?.destroy();
  132. compressorObj = undefined;
  133. });
  134. compressorObjArr.length = 0;
  135. group = undefined;
  136. model.destroy();
  137. model = undefined;
  138. }
  139. };