window.threejs.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import * as THREE from 'three';
  2. import UseThree from '../../../../utils/threejs/useThree';
  3. import singleWindow from './dandaoFc.threejs';
  4. import singleWindowBet from './dandaoFcBet.threejs';
  5. import doubleWindow from './shuangdaoFc.threejs';
  6. import { animateCamera } from '/@/utils/threejs/util';
  7. import useEvent from '../../../../utils/threejs/useEvent';
  8. import { useGlobSetting } from '/@/hooks/setting';
  9. // import * as dat from 'dat.gui';
  10. // const gui = new dat.GUI();
  11. // gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
  12. // 模型对象、 文字对象
  13. let model: UseThree,
  14. singleWindowObj: singleWindow | singleWindowBet,
  15. doubleWindowObj: doubleWindow,
  16. group: THREE.Object3D,
  17. windowType = 'singleWindow';
  18. const { mouseDownFn } = useEvent();
  19. // 打灯光
  20. const addLight = () => {
  21. if (!model || !model.scene) return;
  22. const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
  23. directionalLight.position.set(-110, 150, 647);
  24. model.scene?.add(directionalLight);
  25. // directionalLight.target = group;
  26. const pointLight2 = new THREE.PointLight(0xffffff, 1, 150);
  27. pointLight2.position.set(-101, 34, 16);
  28. pointLight2.shadow.bias = 0.05;
  29. model.scene.add(pointLight2);
  30. const pointLight3 = new THREE.PointLight(0xffffff, 1, 150);
  31. pointLight3.position.set(19, 25, -7);
  32. pointLight3.shadow.bias = 0.05;
  33. model.scene.add(pointLight3);
  34. const pointLight6 = new THREE.PointLight(0xffffff, 1, 300);
  35. pointLight6.position.set(51, 51, 9);
  36. pointLight6.shadow.bias = 0.05;
  37. model.scene.add(pointLight6);
  38. };
  39. // 初始化左右摇摆动画
  40. const startAnimation = () => {
  41. // 定义鼠标点击事件
  42. model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null));
  43. model.canvasContainer?.addEventListener('pointerup', (event) => {
  44. event.stopPropagation();
  45. // 单道、 双道
  46. if (windowType === 'doubleWindow' && doubleWindowObj) {
  47. doubleWindowObj.mouseUpModel.call(doubleWindowObj);
  48. } else if (windowType === 'singleWindow' && singleWindowObj) {
  49. singleWindowObj.mouseUpModel.call(singleWindowObj);
  50. }
  51. });
  52. };
  53. // 鼠标点击、松开事件
  54. const mouseEvent = (event) => {
  55. if (event.button == 0) {
  56. mouseDownFn(model, group, event, (intersects) => {
  57. if (windowType === 'doubleWindow' && doubleWindowObj) {
  58. doubleWindowObj.mousedownModel.call(doubleWindowObj, intersects);
  59. } else if (windowType === 'singleWindow' && singleWindowObj) {
  60. singleWindowObj.mousedownModel.call(singleWindowObj, intersects);
  61. }
  62. });
  63. }
  64. };
  65. export const addMonitorText = (selectData) => {
  66. if (windowType === 'doubleWindow' && doubleWindowObj) {
  67. return doubleWindowObj.addMonitorText.call(doubleWindowObj, selectData);
  68. } else if (windowType === 'singleWindow' && singleWindowObj) {
  69. return singleWindowObj.addMonitorText.call(singleWindowObj, selectData);
  70. }
  71. };
  72. export const play = (rotationParam, flag) => {
  73. if (windowType === 'doubleWindow' && doubleWindowObj) {
  74. return doubleWindowObj.play.call(doubleWindowObj, rotationParam, flag);
  75. } else if (windowType === 'singleWindow' && singleWindowObj) {
  76. return singleWindowObj.play.call(singleWindowObj, rotationParam, flag);
  77. }
  78. };
  79. export const initCameraCanvas = async (playerVal1?, playerVal2?) => {
  80. if (windowType === 'singleWindow' && singleWindowObj) {
  81. return await singleWindowObj.initCamera.call(singleWindowObj, playerVal1);
  82. } else if (windowType === 'doubleWindow' && doubleWindowObj) {
  83. return doubleWindowObj.initCamera.call(doubleWindowObj, playerVal1);
  84. }
  85. };
  86. // 切换风窗类型
  87. export const setModelType = (type) => {
  88. // if (!model || !model.scene) return;
  89. windowType = type;
  90. return new Promise((resolve) => {
  91. // 显示双道风窗
  92. if (windowType === 'doubleWindow' && doubleWindowObj && doubleWindowObj.group) {
  93. model.startAnimation = doubleWindowObj.render.bind(doubleWindowObj);
  94. group = doubleWindowObj.group;
  95. if (model.scene?.getObjectByName('ddFc')) {
  96. model.scene.remove(singleWindowObj.group);
  97. }
  98. const oldCameraPosition = { x: 100, y: 0, z: 500 };
  99. model.scene?.add(doubleWindowObj.group);
  100. setTimeout(async () => {
  101. resolve(null);
  102. await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model);
  103. }, 300);
  104. } else if (windowType === 'singleWindow') {
  105. // 显示单道风窗
  106. model.startAnimation = singleWindowObj.render.bind(singleWindowObj);
  107. group = singleWindowObj.group;
  108. if (model.scene?.getObjectByName('sdFc')) {
  109. model.scene?.remove(doubleWindowObj.group);
  110. }
  111. const oldCameraPosition = { x: 100, y: 0, z: 500 };
  112. model.scene?.add(singleWindowObj.group);
  113. setTimeout(async () => {
  114. resolve(null);
  115. await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model);
  116. }, 300);
  117. }
  118. });
  119. };
  120. export const mountedThree = (playerDom) => {
  121. const { sysOrgCode } = useGlobSetting();
  122. return new Promise(async (resolve) => {
  123. model = new UseThree('#window3D');
  124. if (!model || !model.renderer || !model.camera) return;
  125. model.setEnvMap('test1');
  126. resolve(null);
  127. model.camera.position.set(100, 0, 1000);
  128. // 单道、 双道
  129. doubleWindowObj = new doubleWindow(model);
  130. if (sysOrgCode === 'sdmtjtbetmk') {
  131. singleWindowObj = new singleWindowBet(model);
  132. } else {
  133. singleWindowObj = new singleWindow(model);
  134. }
  135. doubleWindowObj.mountedThree(playerDom);
  136. singleWindowObj.mountedThree(playerDom);
  137. model.animate();
  138. addLight();
  139. startAnimation();
  140. });
  141. };
  142. export const destroy = () => {
  143. if (model) {
  144. model.isRender = false;
  145. console.log('场景销毁前信息----------->', model.renderer?.info);
  146. model.isRender = false;
  147. doubleWindowObj.destroy();
  148. singleWindowObj.destroy();
  149. model.destroy();
  150. model = null;
  151. group = null;
  152. singleWindowObj = null;
  153. doubleWindowObj = null;
  154. }
  155. };