QingXiCheAndQvThreeWorldEvent.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { ComVal } from "../common/ComVal.js";
  2. import { QingXiCheAndQvCarEventClick } from "../js/QingXiCheAndQvCarEventClick.js";
  3. import { QingXiCheAndQvComHighlightLayer } from "../js/QingXiCheAndQvComHighlightLayer.js";
  4. /**
  5. * 操作 3d场景 相关事件
  6. */
  7. export class QingXiCheAndQvThreeWorldEvent {
  8. // 每次 new 出对象则会调用这个构造函数
  9. constructor() {
  10. // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  11. this.objIframeEdit = null;
  12. // iframe对象
  13. this.objIframe = null;
  14. // 3d世界的场景,后续要操作3d世界常用的对象
  15. this.objScene = null;
  16. // babylon 对象,懂babylon,就可以使用babylon的api去操作
  17. this.BABYLON = null;
  18. // 操作 Cesium 的类
  19. this.objCesiumMain = null;
  20. // 当前鼠标是否按住
  21. this.clickPressBool = false;
  22. // 记录鼠标最后一次点击的时间戳
  23. this.clickTime = 0;
  24. }
  25. /**
  26. * 初始化方法
  27. * objIframeEdit 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  28. * objIframe iframe对象
  29. * objScene 场景对象
  30. * BABYLON babylon.js对象,用于后续调用babylon的代码去创建更新等操作
  31. * objCesiumMain 操作 Cesium 的类
  32. */
  33. initObj = function (objIframeEdit, objIframe, objScene, BABYLON, objCesiumMain) {
  34. if (this.objIframe != null && this.objIframe != undefined) {
  35. return this;
  36. }
  37. this.objIframeEdit = objIframeEdit;
  38. this.objIframe = objIframe;
  39. this.objScene = objScene;
  40. this.BABYLON = BABYLON;
  41. this.pointerEvent();
  42. this.renderEvent();
  43. return this;
  44. }
  45. /**
  46. * 鼠标事件
  47. */
  48. pointerEvent = function() {
  49. var thisClass = this;
  50. var BABYLON = this.BABYLON;
  51. var objScene = this.objScene;
  52. objScene.onPointerObservable.add(
  53. (pointerInfo) => {
  54. if (
  55. // 鼠标按住
  56. thisClass.clickPressBool == true
  57. ) {
  58. // 获取选择的对象, 通过测试 scene.pick() 方法是非常消耗性能的
  59. let pickResultMove = objScene.pick(
  60. objScene.pointerX,
  61. objScene.pointerY
  62. );
  63. if (pickResultMove.hit) {
  64. // console.log(
  65. // "鼠标按住移动触发逻辑",
  66. // "pickResultMove", pickResultMove
  67. // );
  68. thisClass.clickMoveEvent(pickResultMove);
  69. }
  70. }
  71. // 如果点击到3d世界里的物体的时候
  72. if (pointerInfo.pickInfo.hit) {
  73. var pickResult = pointerInfo.pickInfo;
  74. switch (pointerInfo.type) {
  75. case BABYLON.PointerEventTypes.POINTERDOWN:
  76. // console.log("clickType 鼠标按下");
  77. thisClass.clickEvent(pickResult);
  78. break;
  79. case BABYLON.PointerEventTypes.POINTERUP:
  80. // console.log("clickType 鼠标弹起");
  81. thisClass.clickUpEvent(pickResult);
  82. break;
  83. case BABYLON.PointerEventTypes.POINTERMOVE:
  84. // console.log("clickType 鼠标移动中");
  85. break;
  86. case BABYLON.PointerEventTypes.POINTERWHEEL:
  87. // console.log("clickType 鼠标滚轮滚动中");
  88. break;
  89. case BABYLON.PointerEventTypes.POINTERPICK:
  90. // console.log("clickType 鼠标指针选中事件");
  91. break;
  92. case BABYLON.PointerEventTypes.POINTERTAP:
  93. // console.log("clickType 当对象被触摸并在没有拖动的情况下释放时,触发指针触发事件。");
  94. break;
  95. case BABYLON.PointerEventTypes.POINTERDOUBLETAP:
  96. // console.log("clickType 鼠标双击");
  97. break;
  98. }
  99. }
  100. }
  101. );
  102. }
  103. /**
  104. * 点击事件
  105. * pickResult 返回的鼠标参数
  106. */
  107. clickEvent = function(pickResult) {
  108. var thisClass = this;
  109. var BABYLON = this.BABYLON;
  110. var objScene = this.objScene;
  111. this.clickPressBool = true;
  112. this.clickTime = new Date().getTime();
  113. var objMesh = pickResult.pickedMesh;
  114. var objPosition = pickResult.pickedPoint;
  115. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  116. // eslint-disable-next-line no-unused-vars
  117. var getNormal = pickResult.getNormal(true);
  118. // console.log(
  119. // "鼠标点击事件",
  120. // // pickResult
  121. // objMesh, objPosition, getNormal
  122. // );
  123. QingXiCheAndQvCarEventClick.find().clickMeshEvent(pickResult);
  124. }
  125. /**
  126. * 鼠标弹起事件
  127. * pickResult 返回的鼠标参数
  128. */
  129. clickUpEvent = function(pickResult) {
  130. var thisClass = this;
  131. var objScene = this.objScene;
  132. var objIframe = this.objIframe;
  133. var BABYLON = this.BABYLON;
  134. this.clickPressBool = false;
  135. var thisTime = new Date().getTime();
  136. // 与点击相差时间
  137. var upTime = thisTime - this.clickTime;
  138. var objMesh = pickResult.pickedMesh;
  139. var objPosition = pickResult.pickedPoint;
  140. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  141. // eslint-disable-next-line no-unused-vars
  142. var getNormal = pickResult.getNormal(true);
  143. // console.log(
  144. // "鼠标弹起事件", upTime,
  145. // // pickResult
  146. // objMesh, objPosition, getNormal
  147. // );
  148. QingXiCheAndQvCarEventClick.find().main(pickResult);
  149. }
  150. /**
  151. * 鼠标按住并且拖拽事件
  152. * pickResult 返回的鼠标参数
  153. */
  154. clickMoveEvent = function(pickResult) {
  155. // 不存在要拖拽移动的物体,则不触发后面逻辑,要不然一直触后面逻辑,会影响性能
  156. if (QingXiCheAndQvCarEventClick.find().moveMeshList.length <= 0) {
  157. return;
  158. }
  159. var thisClass = this;
  160. var objScene = this.objScene;
  161. var objIframe = this.objIframe;
  162. var BABYLON = this.BABYLON;
  163. var objMesh = pickResult.pickedMesh;
  164. var objPosition = pickResult.pickedPoint;
  165. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  166. // eslint-disable-next-line no-unused-vars
  167. var getNormal = pickResult.getNormal(true);
  168. // console.log(
  169. // "鼠标按住拖拽事件",
  170. // // pickResult
  171. // objMesh, objPosition, getNormal
  172. // );
  173. QingXiCheAndQvCarEventClick.find().clickMoveMeshEvent(pickResult);
  174. }
  175. /**
  176. * 帧事件
  177. */
  178. renderEvent = function() {
  179. var thisClass = this;
  180. var objScene = this.objScene;
  181. var objIframe = this.objIframe;
  182. var BABYLON = this.BABYLON;
  183. // 添加帧事件
  184. objScene.onBeforeRenderObservable.add(function() {
  185. // console.log("帧事件触发");
  186. ComVal.find().fpsEventMain();
  187. QingXiCheAndQvComHighlightLayer.find().flickerBoolEvent();
  188. QingXiCheAndQvCarEventClick.find().renderEvent();
  189. if (
  190. QingXiCheAndQvCarEventClick.find().moveCameraRadius != null && QingXiCheAndQvCarEventClick.find().moveCameraRadius != undefined
  191. && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != null && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != undefined
  192. && QingXiCheAndQvCarEventClick.find().moveCameraBeta != null && QingXiCheAndQvCarEventClick.find().moveCameraBeta != undefined
  193. ) {
  194. let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
  195. let objSceneActiveCamera = ChengGuangYuanJing.CommonVal.find().objSceneActiveCamera;
  196. objSceneActiveCamera.radius = QingXiCheAndQvCarEventClick.find().moveCameraRadius;
  197. objSceneActiveCamera.alpha = QingXiCheAndQvCarEventClick.find().moveCameraAlpha;
  198. objSceneActiveCamera.beta = QingXiCheAndQvCarEventClick.find().moveCameraBeta;
  199. }
  200. });
  201. }
  202. }