CourseChapter3d.vue 7.3 KB

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