123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <!-- 实现具体3d逻辑使用 -->
- <script setup lang="ts">
- import CourseChapter3dMain from '@/components/student/CourseChapter3dMain.vue';
- import { threeWorld } from "@/stores/threeWorld.ts";
- import { courseChapter3dShow } from "@/stores/courseChapter3dShow.ts";
- import { ref, watch } from "vue";
- const props = defineProps({
- config : {
- type: Object
- },
- // 获取当前学生任务ID缺陷列表
- studentTaskIdList : {
- type: Object
- },
- });
- // 定义发射给父组件的方法
- const emits = defineEmits([
- // 上一步是否显示
- 'tipsBtnsUpOpen',
- // 下一步是否显示
- 'tipsBtnsDownOpen',
- ]);
- // 【开发的时候】3d场景,iframe地址
- let threeWorldUrl = "3dMain/index.html#/main?id=zidingyi";
- // // 【发布的时候】3d场景,iframe地址
- // // 配置文件地址
- // // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model/";
- // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model2/";// 正式
- // // let commonconfig = "https://www.3dyzt.com/eduTrain/3dMain/model3/";// 临时测试
- // // 模型地址
- // // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model/";
- // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model2/";// 正式
- // // let commonmodel = "https://www.3dyzt.com/eduTrain/3dMain/model3/";// 临时测试
- // // 发布后的地址
- // let threeWorldUrl = "https://www.3dyzt.com/main/index.html#/main?id=zidingyi&user=zidingyi&commonconfig=" + commonconfig + "&commonmodel=" + commonmodel;
- /**
- * 上一步是否显示
- * open true - 显示, false - 隐藏
- */
- const tipsBtnsUpOpenEvent = (open : Boolean) => {
- emits('tipsBtnsUpOpen', open);
- }
- /**
- * 下一步是否显示
- * open true - 显示, false - 隐藏
- */
- const tipsBtnsDownOpenEvent = (open : Boolean) => {
- emits('tipsBtnsDownOpen', open);
- }
- /**
- * 监听发送参数变化,来控制切换3d的逻辑
- */
- watch(
- () => props.config,
- (newVal, oldVal) => {
- // console.log(
- // newVal, oldVal,
- // props.config
- // );
-
- // 如果没有加载完成,则不触发后面的逻辑
- if (threeWorld().loadSuccess == false) {
- return;
- }
- typeEvent(props.config?.threeDimensionalConfig);
- }
- );
- /**
- * 回调加载百分比
- */
- const callbackLoadPercentageEvent = (json: { loadPercentage: any; }) => {
- // console.log("回调加载百分比", json)
- const loadPercentage = parseFloat(json["loadPercentage"]);
- // 加载小于百分比
- if (loadPercentage < 100) {
- // ##############################【这里只做控制】隐藏其他按钮界面等
- threeWorld().loadSuccess = false;
-
- return
- }
- }
- /**
- * 回调加载完成
- */
- const callbackLoadEndEvent = (json : { 'roleChoiceOpenBool' : true }) => {
- // console.log("回调加载完成", json)
- // 此时是显示角色的界面
- if (json["roleChoiceOpenBool"] === true) {
- // ############################## 隐藏其他按钮界面等
- threeWorld().loadSuccess = false;
-
- return;
- }
- // ############################## 这个时候,是真正的进入3d画面了,才显示其他按钮界面等
- threeWorld().loadSuccess = true;
-
- }
- /**
- * 回调距离范围内
- */
- const callbackDistanceYesEvent = (json : any) => {
- // console.log("回调距离范围内", json);
- }
- /**
- * 回调距离范围外
- */
- const callbackDistanceNoEvent = (json : any) => {
- // console.log("回调距离范围外", json);
- }
- /**
- * 回调视角切换完成
- */
- const callbackCameraVisualAngleJsonToLookEvent = (json : any) => {
- // console.log("视角触发完成", json);
- }
- /**
- * 3d加载完成优先切换到默认的视角
- */
- const initScene = () => {
- // console.log(
- // "initScene = () => {",
- // threeWorld().obj.newIframe,
- // threeWorld().obj.newIframe.getCameraVisualAngleGetList()
- // );
-
- // @ts-ignore
- threeWorld().obj.newIframe.cameraVisualAngleGetListNameGpsTo("检测车");
- // @ts-ignore
- threeWorld().obj.newIframe.roleShow(false);
- // 清空3d背景
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.clearColor = {
- "r" : 0, "g" : 0, "b" : 0, "a" : 0
- };
- groundNoRemove();
- typeEvent(props.config?.threeDimensionalConfig);
- // 触发自动点击逻辑
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.CommonVal.find().screenClickNumEvent();
- }
- /**
- * 将所有设置为地面的,改为不设置为地面
- */
- const groundNoRemove = () => {
-
- // @ts-ignore
- for (const key in threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson) {
-
- if (
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson[key]['isGround'] == true
- ) {
- // 通过更新材质的参数,来更新
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.ModelObjEdit.find().objOneMeshListIdToJsonUpdate(
- key,
- {
-
- "isGround" : false,
- }
- );
- }
-
- }
- // @ts-ignore
- for (let i = 0; i < threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.meshes.length; i++) {
- // @ts-ignore
- let objMesh = threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.CommonVal.find().objScene.meshes[i];
- // console.log(
- // "myIsGround",
- // objMesh["myIsGround"]
- // );
- // if (objMesh["myIsGround"] == true) {
- // delete objMesh["myIsGround"];
- // }
- delete objMesh["myIsGround"];
- }
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.Role.find().isGroundList = {};
- // @ts-ignore
- threeWorld().obj.newIframe.objIframe.ChengGuangYuanJing.ModelObjEdit.find().myIsGroundConfigNum = 0;
- }
- /**
- * 根据不同的类型,切换对应的3d逻辑
- */
- const typeEvent = (type : any) => {
- console.log(
- "根据不同的类型,切换对应的3d逻辑",
- type
- );
-
- switch(type) {
- // 操作帮助
- case 'operationHelp':
-
- break;
-
- // 设备拆解
- case 'equipmentDisassembly':
-
- break;
-
- default:
-
- break;
-
- }
-
- }
- </script>
- <template>
- <!-- 3d课程配置:{{ props.config }} -->
- <img v-if="courseChapter3dShow().show.threeWorldMask == true" class="threeWorldMask" src="../../assets/student/mask.webp" />
- <CourseChapter3dMain
- :iframeId="'newIframe'"
- :url="threeWorldUrl"
- @callbackLoadPercentage="callbackLoadPercentageEvent"
- @callbackLoadEnd="callbackLoadEndEvent"
- @callbackDistanceYes="callbackDistanceYesEvent"
- @callbackDistanceNo="callbackDistanceNoEvent"
- @callbackCameraVisualAngleJsonToLook="callbackCameraVisualAngleJsonToLookEvent"
- ></CourseChapter3dMain>
- </template>
- <style scoped>
- .threeWorldMask {
- position: fixed;
- z-index: 1;
- width: 100%;
- height: 100%;
- top: 0px;
- left: 0px;
- pointer-events: none;
- }
- </style>
|