CourseChapter3d.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <!-- 实现具体3d逻辑使用 -->
  2. <script setup lang="ts">
  3. import CourseChapter3dMain from '@/components/student/CourseChapter3dMain.vue';
  4. import { threeWorld } from "@/stores/threeWorld.ts";
  5. import { courseChapter3dShow } from "@/stores/courseChapter3dShow.ts";
  6. import { ThreeWorldEvent } from "./ThreeWorldEvent/js/ThreeWorldEvent.ts";
  7. import { ThreeWorldEventMain } from "./ThreeWorldEvent/js/ThreeWorldEventMain.ts";
  8. import { ref, watch } from "vue";
  9. const props = defineProps({
  10. config : {
  11. type: Object
  12. },
  13. // 获取当前学生任务ID缺陷列表
  14. studentTaskIdList : {
  15. type: Object
  16. },
  17. });
  18. // 定义发射给父组件的方法
  19. const emits = defineEmits([
  20. // 上一步是否显示
  21. 'tipsBtnsUpOpen',
  22. // 下一步是否显示
  23. 'tipsBtnsDownOpen',
  24. ]);
  25. // 【开发的时候】3d场景,iframe地址
  26. let threeWorldUrl = "3dMain/index.html#/main?id=zidingyi";
  27. // // 【发布的时候】3d场景,iframe地址
  28. // // 配置文件地址
  29. // // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model/";
  30. // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model2/";// 正式
  31. // // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model3/";// 临时测试
  32. // // 模型地址
  33. // // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model/";
  34. // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model2/";// 正式
  35. // // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model3/";// 临时测试
  36. // // 发布后的地址
  37. // let threeWorldUrl = "https://www.3dyzt.com/main/index.html#/main?id=zidingyi&user=zidingyi&commonconfig=" + commonconfig + "&commonmodel=" + commonmodel;
  38. /**
  39. * 上一步是否显示
  40. * open true - 显示, false - 隐藏
  41. */
  42. const tipsBtnsUpOpenEvent = (open : Boolean) => {
  43. emits('tipsBtnsUpOpen', open);
  44. }
  45. /**
  46. * 下一步是否显示
  47. * open true - 显示, false - 隐藏
  48. */
  49. const tipsBtnsDownOpenEvent = (open : Boolean) => {
  50. emits('tipsBtnsDownOpen', open);
  51. }
  52. /**
  53. * 监听发送参数变化,来控制切换3d的逻辑
  54. */
  55. watch(
  56. () => props.config,
  57. (newVal, oldVal) => {
  58. // console.log(
  59. // newVal, oldVal,
  60. // props.config
  61. // );
  62. // 如果没有加载完成,则不触发后面的逻辑
  63. if (threeWorld().loadSuccess == false) {
  64. return;
  65. }
  66. typeEvent(props.config?.threeDimensionalConfig);
  67. }
  68. );
  69. /**
  70. * 回调加载百分比
  71. */
  72. const callbackLoadPercentageEvent = (json: { loadPercentage: any; }) => {
  73. // console.log("回调加载百分比", json)
  74. const loadPercentage = parseFloat(json["loadPercentage"]);
  75. // 加载小于百分比
  76. if (loadPercentage < 100) {
  77. // ##############################【这里只做控制】隐藏其他按钮界面等
  78. threeWorld().loadSuccess = false;
  79. return
  80. }
  81. }
  82. /**
  83. * 回调加载完成
  84. */
  85. const callbackLoadEndEvent = (json : { 'roleChoiceOpenBool' : true }) => {
  86. // console.log("回调加载完成", json)
  87. // 此时是显示角色的界面
  88. if (json["roleChoiceOpenBool"] === true) {
  89. // ############################## 隐藏其他按钮界面等
  90. threeWorld().loadSuccess = false;
  91. initScene();
  92. return;
  93. }
  94. // ############################## 这个时候,是真正的进入3d画面了,才显示其他按钮界面等
  95. threeWorld().loadSuccess = true;
  96. }
  97. /**
  98. * 回调距离范围内
  99. */
  100. const callbackDistanceYesEvent = (json : any) => {
  101. // console.log("回调距离范围内", json);
  102. }
  103. /**
  104. * 回调距离范围外
  105. */
  106. const callbackDistanceNoEvent = (json : any) => {
  107. // console.log("回调距离范围外", json);
  108. }
  109. /**
  110. * 回调视角切换完成
  111. */
  112. const callbackCameraVisualAngleJsonToLookEvent = (json : any) => {
  113. // console.log("视角触发完成", json);
  114. }
  115. /**
  116. * 3d加载完成优先切换到默认的视角
  117. */
  118. const initScene = () => {
  119. let objNewIframe : any = threeWorld().obj.newIframe;
  120. ThreeWorldEventMain.find().initObj(
  121. objNewIframe,
  122. objNewIframe.objIframe,
  123. objNewIframe.objIframe.ChengGuangYuanJing.CommonVal.find().objScene,
  124. objNewIframe.objIframe.BABYLON
  125. );
  126. ThreeWorldEvent.find().initObj(
  127. objNewIframe,
  128. objNewIframe.objIframe,
  129. objNewIframe.objIframe.ChengGuangYuanJing.CommonVal.find().objScene,
  130. objNewIframe.objIframe.BABYLON
  131. );
  132. // // @ts-ignore
  133. // threeWorld().obj.newIframe.cameraVisualAngleGetListNameGpsTo("检测车");
  134. // // @ts-ignore
  135. // threeWorld().obj.newIframe.roleShow(false);
  136. // typeEvent(props.config?.threeDimensionalConfig);
  137. // // 触发自动点击逻辑
  138. // // @ts-ignore
  139. // threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.CommonVal.find().screenClickNumEvent();
  140. }
  141. /**
  142. * 根据不同的类型,切换对应的3d逻辑
  143. */
  144. const typeEvent = (type : any) => {
  145. console.log(
  146. "根据不同的类型,切换对应的3d逻辑",
  147. type
  148. );
  149. switch(type) {
  150. // 操作帮助
  151. case 'operationHelp':
  152. break;
  153. // 设备拆解
  154. case 'equipmentDisassembly':
  155. break;
  156. default:
  157. break;
  158. }
  159. }
  160. </script>
  161. <template>
  162. <!-- 3d课程配置:{{ props.config }} -->
  163. <img v-if="courseChapter3dShow().show.threeWorldMask == true" class="threeWorldMask" src="../../assets/student/mask.webp" />
  164. <CourseChapter3dMain
  165. :iframeId="'newIframe'"
  166. :url="threeWorldUrl"
  167. @callbackLoadPercentage="callbackLoadPercentageEvent"
  168. @callbackLoadEnd="callbackLoadEndEvent"
  169. @callbackDistanceYes="callbackDistanceYesEvent"
  170. @callbackDistanceNo="callbackDistanceNoEvent"
  171. @callbackCameraVisualAngleJsonToLook="callbackCameraVisualAngleJsonToLookEvent"
  172. ></CourseChapter3dMain>
  173. </template>
  174. <style scoped>
  175. .threeWorldMask {
  176. position: fixed;
  177. z-index: 1;
  178. width: 100%;
  179. height: 100%;
  180. top: 0px;
  181. left: 0px;
  182. pointer-events: none;
  183. }
  184. </style>