nitrogen.threejs.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 * as dat from 'dat.gui';
  7. // const gui = new dat.GUI();
  8. // gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
  9. // 模型对象、 文字对象
  10. let model: UseThree | undefined,
  11. group: THREE.Object3D | undefined,
  12. compressorObj: Nitrogen | undefined,
  13. modalType = 'compressor';
  14. const { mouseDownFn, mousemoveFn, mouseUpFn } = useEvent();
  15. // 鼠标点击、松开事件
  16. const mouseEvent = (event) => {
  17. // 单道、 双道
  18. if (event.button == 0 && model && group) {
  19. model.canvasContainer?.addEventListener('mousemove', mousemove);
  20. mouseDownFn(model, group, event, (intersects) => {
  21. if (modalType === 'compressor') {
  22. compressorObj?.mousedownModel.call(compressorObj, intersects);
  23. }
  24. });
  25. }
  26. };
  27. const mouseUp = () => {
  28. if (!model) return;
  29. mouseUpFn(model);
  30. model.canvasContainer?.removeEventListener('mousemove', mousemove);
  31. };
  32. const mousemove = () => {
  33. mousemoveFn();
  34. };
  35. const render = () => {
  36. if (model && model.isRender) {
  37. model.animationId = requestAnimationFrame(render.bind(this));
  38. model.stats?.update();
  39. if (model.renderEnabled) {
  40. model.render();
  41. }
  42. }
  43. };
  44. /* 添加监控数据 */
  45. export const addText = () => {
  46. if (!compressorObj) return;
  47. if (modalType === 'compressor') {
  48. return compressorObj.addCssText.call(compressorObj);
  49. }
  50. };
  51. export const play = () => {
  52. if (modalType === 'compressor' && compressorObj) {
  53. return compressorObj.play.call(compressorObj);
  54. }
  55. };
  56. // 切换风窗类型
  57. export const setModelType = (type) => {
  58. modalType = type;
  59. model?.camera?.position.set(-1000, 100, 500);
  60. return new Promise((resolve) => {
  61. // 显示双道风窗
  62. if (modalType === 'compressor' && compressorObj && compressorObj.group) {
  63. group = compressorObj.group;
  64. const oldCameraPosition = { x: -1000, y: 100, z: 500 };
  65. const oldControlsPosition = { x: 0, y: 0, z: 0 };
  66. model?.scene?.add(compressorObj.group);
  67. let newCameraPosition = { x: 0, y: 0, z: 0 },
  68. newControlsPosition = { x: 0, y: 0, z: 0 };
  69. if (group.children.length == 6) {
  70. newCameraPosition = { x: -1.7434040517387115, y: 46.41089142470955, z: 114.33388865672832 };
  71. newControlsPosition = { x: -1.6994314417499141, y: -12.38981035037152, z: 10.110013648346193 };
  72. } else if (group.children.length == 5) {
  73. newCameraPosition = { x: -1.2741159124866441, y: 46.04318455197148, z: 95.25814325750986 };
  74. newControlsPosition = { x: -1.699431, y: -12.38981, z: -1.699431 };
  75. } else if (group.children.length == 4) {
  76. newCameraPosition = { x: -1.7434040517387115, y: 46.41089142470955, z: 114.33388865672832 };
  77. newControlsPosition = { x: -1.6994314417499141, y: -12.38981035037152, z: 10.110013648346193 };
  78. } else if (group.children.length == 3) {
  79. newCameraPosition = { x: -1.2741159124866441, y: 46.04318455197148, z: 70.25814325750986 };
  80. newControlsPosition = { x: -1.699431, y: -12.38981, z: -1.699431 };
  81. }
  82. setTimeout(async () => {
  83. resolve(null);
  84. await animateCamera(oldCameraPosition, oldControlsPosition, newCameraPosition, newControlsPosition, model, 0.8);
  85. }, 300);
  86. }
  87. });
  88. };
  89. export const mountedThree = (compressorNum) => {
  90. return new Promise(async (resolve) => {
  91. model = new UseThree('#compressor3D', '#compressorCss3D');
  92. model.setEnvMap('test1');
  93. model.renderer.toneMappingExposure = 1.0;
  94. model.canvasContainer?.addEventListener('mousedown', mouseEvent);
  95. model.canvasContainer?.addEventListener('pointerup', mouseUp);
  96. compressorObj = new Nitrogen(model);
  97. await compressorObj.mountedThree(compressorNum);
  98. setModelType('compressor');
  99. resolve(null);
  100. // 添加摄像机辅助
  101. // const helper = new THREE.CameraHelper(model.camera as THREE.Camera);
  102. // model?.scene?.add(helper);
  103. render();
  104. });
  105. };
  106. export const destroy = () => {
  107. if (model) {
  108. model.isRender = false;
  109. console.log('场景销毁前信息----------->', model.renderer?.info);
  110. compressorObj?.destroy();
  111. group = undefined;
  112. model.destroy();
  113. model = undefined;
  114. }
  115. };