CourseChapter3d.vue 7.1 KB

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