QingXiCheAndQvThreeWorldEvent.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. import { ComVal } from "../common/ComVal.js";
  2. import { QingXiCheAndQvCarEventClick } from "../js/QingXiCheAndQvCarEventClick.js";
  3. import { QingXiCheAndQvComHighlightLayer } from "../js/QingXiCheAndQvComHighlightLayer.js";
  4. import { ElMessage, ElMessageBox } from 'element-plus';
  5. /**
  6. * 操作 3d场景 相关事件
  7. */
  8. export class QingXiCheAndQvThreeWorldEvent {
  9. // 每次 new 出对象则会调用这个构造函数
  10. constructor() {
  11. // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  12. this.objIframeEdit = null;
  13. // iframe对象
  14. this.objIframe = null;
  15. // 3d世界的场景,后续要操作3d世界常用的对象
  16. this.objScene = null;
  17. // babylon 对象,懂babylon,就可以使用babylon的api去操作
  18. this.BABYLON = null;
  19. // 操作 Cesium 的类
  20. this.objCesiumMain = null;
  21. // 当前鼠标是否按住
  22. this.clickPressBool = false;
  23. // 记录鼠标最后一次点击的时间戳
  24. this.clickTime = 0;
  25. }
  26. /**
  27. * 初始化方法
  28. * objIframeEdit 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  29. * objIframe iframe对象
  30. * objScene 场景对象
  31. * BABYLON babylon.js对象,用于后续调用babylon的代码去创建更新等操作
  32. * objCesiumMain 操作 Cesium 的类
  33. */
  34. initObj = function (objIframeEdit, objIframe, objScene, BABYLON, objCesiumMain) {
  35. if (this.objIframe != null && this.objIframe != undefined) {
  36. return this;
  37. }
  38. this.objIframeEdit = objIframeEdit;
  39. this.objIframe = objIframe;
  40. this.objScene = objScene;
  41. this.BABYLON = BABYLON;
  42. this.pointerEvent();
  43. this.renderEvent();
  44. return this;
  45. }
  46. /**
  47. * 鼠标事件
  48. */
  49. pointerEvent = function() {
  50. var thisClass = this;
  51. var BABYLON = this.BABYLON;
  52. var objScene = this.objScene;
  53. objScene.onPointerObservable.add(
  54. (pointerInfo) => {
  55. if (
  56. // 鼠标按住
  57. thisClass.clickPressBool == true
  58. ) {
  59. // 获取选择的对象, 通过测试 scene.pick() 方法是非常消耗性能的
  60. let pickResultMove = objScene.pick(
  61. objScene.pointerX,
  62. objScene.pointerY
  63. );
  64. if (pickResultMove.hit) {
  65. // console.log(
  66. // "鼠标按住移动触发逻辑",
  67. // "pickResultMove", pickResultMove
  68. // );
  69. thisClass.clickMoveEvent(pickResultMove);
  70. }
  71. }
  72. // 如果点击到3d世界里的物体的时候
  73. if (pointerInfo.pickInfo.hit) {
  74. var pickResult = pointerInfo.pickInfo;
  75. switch (pointerInfo.type) {
  76. case BABYLON.PointerEventTypes.POINTERDOWN:
  77. // console.log("clickType 鼠标按下");
  78. thisClass.clickEvent(pickResult);
  79. break;
  80. case BABYLON.PointerEventTypes.POINTERUP:
  81. // console.log("clickType 鼠标弹起");
  82. thisClass.clickUpEvent(pickResult);
  83. break;
  84. case BABYLON.PointerEventTypes.POINTERMOVE:
  85. // console.log("clickType 鼠标移动中");
  86. break;
  87. case BABYLON.PointerEventTypes.POINTERWHEEL:
  88. // console.log("clickType 鼠标滚轮滚动中");
  89. break;
  90. case BABYLON.PointerEventTypes.POINTERPICK:
  91. // console.log("clickType 鼠标指针选中事件");
  92. break;
  93. case BABYLON.PointerEventTypes.POINTERTAP:
  94. // console.log("clickType 当对象被触摸并在没有拖动的情况下释放时,触发指针触发事件。");
  95. break;
  96. case BABYLON.PointerEventTypes.POINTERDOUBLETAP:
  97. // console.log("clickType 鼠标双击");
  98. break;
  99. }
  100. }
  101. }
  102. );
  103. }
  104. /**
  105. * 点击事件
  106. * pickResult 返回的鼠标参数
  107. */
  108. clickEvent = function(pickResult) {
  109. var thisClass = this;
  110. var BABYLON = this.BABYLON;
  111. var objScene = this.objScene;
  112. this.clickPressBool = true;
  113. this.clickTime = new Date().getTime();
  114. var objMesh = pickResult.pickedMesh;
  115. var objPosition = pickResult.pickedPoint;
  116. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  117. // eslint-disable-next-line no-unused-vars
  118. var getNormal = pickResult.getNormal(true);
  119. // console.log(
  120. // "鼠标点击事件",
  121. // // pickResult
  122. // objMesh, objPosition, getNormal
  123. // );
  124. QingXiCheAndQvCarEventClick.find().clickMeshEvent(pickResult);
  125. }
  126. /**
  127. * 鼠标弹起事件
  128. * pickResult 返回的鼠标参数
  129. */
  130. clickUpEvent = function(pickResult) {
  131. var thisClass = this;
  132. var objScene = this.objScene;
  133. var objIframe = this.objIframe;
  134. var BABYLON = this.BABYLON;
  135. this.clickPressBool = false;
  136. var thisTime = new Date().getTime();
  137. // 与点击相差时间
  138. var upTime = thisTime - this.clickTime;
  139. var objMesh = pickResult.pickedMesh;
  140. var objPosition = pickResult.pickedPoint;
  141. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  142. // eslint-disable-next-line no-unused-vars
  143. var getNormal = pickResult.getNormal(true);
  144. // console.log(
  145. // "鼠标弹起事件", upTime,
  146. // // pickResult
  147. // objMesh, objPosition, getNormal
  148. // );
  149. if (thisClass.experimentMeshBool(pickResult) == true) {
  150. ElMessageBox.confirm(
  151. '确定进行该操作吗?',
  152. '提示',
  153. {
  154. confirmButtonText: '确定',
  155. cancelButtonText: '取消',
  156. type: 'warning',
  157. }
  158. )
  159. .then(() => {
  160. // ElMessage({
  161. // type: 'success',
  162. // message: 'Delete completed',
  163. // })
  164. QingXiCheAndQvCarEventClick.find().main(pickResult);
  165. })
  166. .catch(() => {
  167. // ElMessage({
  168. // type: 'info',
  169. // message: '取消成功',
  170. // })
  171. })
  172. }
  173. // QingXiCheAndQvCarEventClick.find().main(pickResult);
  174. }
  175. /**
  176. * 判断是否是点击物体的范围内
  177. * pickResult 点击的具体坐标,物体等信息
  178. *
  179. */
  180. experimentMeshBool = function(pickResult) {
  181. var thisClass = this;
  182. var objScene = this.objScene;
  183. var objIframe = this.objIframe;
  184. var BABYLON = this.BABYLON;
  185. // 优先判断当前流程,是否需要进行物体点击判断逻辑的触发
  186. let listIndex = QingXiCheAndQvCarEventClick.find().QingXiCheAndQvProcessEventStore.obj.listIndex;
  187. let list = QingXiCheAndQvCarEventClick.find().QingXiCheAndQvProcessEventStore.obj.list;
  188. if (list[listIndex] == null || list[listIndex] == undefined) {
  189. return false;
  190. }
  191. // 得到当前流程的配置
  192. let obj = list[listIndex];
  193. // console.log("experimentMeshBool 得到当前的流程", obj);
  194. if (typeof obj.correctAnswerMesh != 'object' || obj.correctAnswerMesh == {}) {
  195. return false;
  196. }
  197. // console.log("experimentMeshBool =====>", pickResult, QingXiCheAndQvCarEventClick.find().QingXiCheAndQvProcessEventStore);
  198. var objMesh = pickResult.pickedMesh;
  199. if (typeof objMesh.id != 'string') {
  200. return false;
  201. }
  202. let meshId = objMesh.id;
  203. for (let i = 0; i < QingXiCheAndQvCarEventClick.find().QingXiCheAndQvProcessEventStore.obj.list.length; i++ ) {
  204. let thisList = QingXiCheAndQvCarEventClick.find().QingXiCheAndQvProcessEventStore.obj.list[i];
  205. // console.log("experimentMeshBool thisList =====>", thisList);
  206. if (typeof thisList.correctAnswerMesh == 'object' ) {
  207. for (let key in thisList.correctAnswerMesh) {
  208. let json = thisList.correctAnswerMesh[key];
  209. // console.log("experimentMeshBool key =====>", key, json, meshId);
  210. if (meshId == key) {
  211. return true;
  212. }
  213. }
  214. }
  215. }
  216. return false;
  217. }
  218. /**
  219. * 鼠标按住并且拖拽事件
  220. * pickResult 返回的鼠标参数
  221. */
  222. clickMoveEvent = function(pickResult) {
  223. // 不存在要拖拽移动的物体,则不触发后面逻辑,要不然一直触后面逻辑,会影响性能
  224. if (QingXiCheAndQvCarEventClick.find().moveMeshList.length <= 0) {
  225. return;
  226. }
  227. var thisClass = this;
  228. var objScene = this.objScene;
  229. var objIframe = this.objIframe;
  230. var BABYLON = this.BABYLON;
  231. var objMesh = pickResult.pickedMesh;
  232. var objPosition = pickResult.pickedPoint;
  233. // 获取点击对象的方向【 一定要加上 true,否则载入的获取模型的方向,会有问题 】
  234. // eslint-disable-next-line no-unused-vars
  235. var getNormal = pickResult.getNormal(true);
  236. // console.log(
  237. // "鼠标按住拖拽事件",
  238. // // pickResult
  239. // objMesh, objPosition, getNormal
  240. // );
  241. QingXiCheAndQvCarEventClick.find().clickMoveMeshEvent(pickResult);
  242. }
  243. /**
  244. * 帧事件
  245. */
  246. renderEvent = function() {
  247. var thisClass = this;
  248. var objScene = this.objScene;
  249. var objIframe = this.objIframe;
  250. var BABYLON = this.BABYLON;
  251. // 添加帧事件
  252. objScene.onBeforeRenderObservable.add(function() {
  253. // console.log("帧事件触发");
  254. ComVal.find().fpsEventMain();
  255. QingXiCheAndQvComHighlightLayer.find().flickerBoolEvent();
  256. QingXiCheAndQvCarEventClick.find().renderEvent();
  257. if (
  258. QingXiCheAndQvCarEventClick.find().moveCameraRadius != null && QingXiCheAndQvCarEventClick.find().moveCameraRadius != undefined
  259. && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != null && QingXiCheAndQvCarEventClick.find().moveCameraAlpha != undefined
  260. && QingXiCheAndQvCarEventClick.find().moveCameraBeta != null && QingXiCheAndQvCarEventClick.find().moveCameraBeta != undefined
  261. ) {
  262. let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
  263. let objSceneActiveCamera = ChengGuangYuanJing.CommonVal.find().objSceneActiveCamera;
  264. objSceneActiveCamera.radius = QingXiCheAndQvCarEventClick.find().moveCameraRadius;
  265. objSceneActiveCamera.alpha = QingXiCheAndQvCarEventClick.find().moveCameraAlpha;
  266. objSceneActiveCamera.beta = QingXiCheAndQvCarEventClick.find().moveCameraBeta;
  267. }
  268. });
  269. }
  270. }