| 
					
				 | 
			
			
				@@ -0,0 +1,922 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<template src="./webgl_rxdz_roam.html"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+</template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import * as THREE from 'three'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import Stats from 'three/addons/libs/stats.module.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import TWEEN from 'three/addons/libs/tween.module.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var requestId = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const util = require('@/utils/util.js').default; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// import util from '@/utils/util.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // const config = require('@/services/urlConfig.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // import requestConfig from '@/static/lib/requestConfig.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import viewShell from'@/components/newBottomCom/viewShell/viewShell.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import viewMask from'@/components/newBottomCom/viewMask/viewMask.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// import { RGBELoader } from '@/webgl/jsm/loaders/RGBELoader.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import screenshot from '@/mixins/screenshot.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import floorMethod from '@/mixins/floorMethod.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import loadModel from '@/mixins/loadModel.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	import wallMethod from '@/mixins/wallMethod.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// import commonPageMethod from '@/common/commonPageMethod.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // const app = getApp(); //获取应用实例 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		components:{viewShell,viewMask}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		mixins:[screenshot,loadModel,floorMethod,wallMethod], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 页面的初始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				pvCurPageName: "room_show", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				locusBehaviorName: "房间展示", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				pvCurPageParams: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                houseId: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				pvId: 'p_2cmina_23080402', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				canvas:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				navbar: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    showCapsule: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    title: '客厅', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    titleColor: '#000', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    navPadding: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    navPaddingBg:'transparent', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    navBarColor: 'transparent', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    navBackColor: 'transparent', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    haveCallback: false, // 如果是 true 会接手 navbarBackClk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    fromShare: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    fromProject: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    shareToken: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				    pageName: this.pvCurPageName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                id:'',// 户型编号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                spaceList:[], // 空间列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                gltfSpaces:[], // 场景中地板模型数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                curSpaceObj:null, // 当前选中的空间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // curSpaceIndex:-1, // 当前选中的空间索引 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				spaceId:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                wallIds:[], // 空间墙体id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				wallList:[], // 墙体数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                gltfWalls:[], // 场景中墙体模型数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                loader:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                scene:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // sky:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                camera:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controlStarPosition : { x:0, y:0, z:0},	//控制器初始位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				cameraStarPosition : { x:0, y:20, z:0}	,//摄像头初始位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				cameraLastPosition: null,		//摄像头上一次移动到的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controlLastPosition: null,		//观察点上一次移动到的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				canvasHeight:408,	//canvas视图的高度-计算得出 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				chooseMesh:null,//标记鼠标拾取到的mesh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				isManyou: false,	//当前是否处在漫游状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				shottingImg: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				progress:1,	//进度条 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				myLoadingStatus:false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// textGeoList:[], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				repeatFlag:false,	//重复点击 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// skyPlan: null, // 天空盒子 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				instancedMeshList: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				screenshotResolve:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				actors:[], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				showDownView:true,//默认显示下载按钮 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				currentActor:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				isIos:false,	//是否ios手机。默认不是 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				circleGroup:null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// aiImagesList:[ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	// "https://dm.static.elab-plus.com/miniProgram/plus_IM01.png", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	// "https://dm.static.elab-plus.com/miniProgram/plus_IM02.png", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	// "https://dm.static.elab-plus.com/miniProgram/plus_IM03.png", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	// "https://dm.static.elab-plus.com/miniProgram/plus_IM04.png", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		beforeDestroy() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			cancelAnimationFrame(requestId, this.canvas) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.worker && this.worker.terminate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (this.renderer instanceof THREE.WebGLRenderer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.renderer.dispose() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.renderer.forceContextLoss() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.renderer.context = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.renderer.domElement = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.renderer = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.clearHandle() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			TWEEN && TWEEN.removeAll();//清除所有的tween; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			console.warn("***beforeDestroy-webgl_rxdz_roam***"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mounted(options) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var that = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			console.warn("***webgl_rxdz_roam-options***",this.$route.query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let unit = window.screen.width / 750;//单位rpm 对应 px 的值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			that.canvasHeight = window.screen.height - (408 * unit) + (20 * unit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.houseId = this.$route.query.houseId?this.$route.query.houseId:''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.spaceId = this.$route.query.spaceId?this.$route.query.spaceId:''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let container = this.$refs.webgl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let canvas3d = this.canvas = this.$refs.glcanvas; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//uniapp 兼容写法,因为uni的页面对象的Vue 实例是$vm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let camera = null, renderer = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let needRender = false;	//是否需要渲染 false表示不需要渲染;true 表示需要渲染 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let loader = this.loader = new GLTFLoader(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let scene = this.scene = new THREE.Scene(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let raycaster = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let mouse = new THREE.Vector2(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let chooseMesh = this.chooseMesh;//标记鼠标拾取到的mesh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let isUserContorl = true;//是否进入漫游状态-默认是 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//漫游时变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let onPointerDownMouseX = 0, onPointerDownMouseY = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lon = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let fingerCount = 0;	//触摸时的手指数目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let startTime = 0;	//非漫游时的移动变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let tweenCameraAnma = false;	//表示当前是否处在动画过程中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let controls = null,boundary=null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			let stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// this.$refs.myLoading.showLoading("加载中...1%") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.$store.state.loadingMsg="加载中...1%"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// this.myLoadingStatus = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.progress = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.clearEvent = clearEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.attendEvent = attendEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// this.meshRoam = meshRoam; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.tweenCameraAnmaChange = tweenCameraAnmaChange; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.switchActor = switchActor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.hideOrShowActor = hideOrShowActor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.starRender = starRender;//对外暴露启动渲染的方法 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.positionCamer = positionCamer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function init() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                scene.background = new THREE.Color("#FFFFFF"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// scene.environment = new THREE.Color("#F2F2F2"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 创建一个HDR贴图加载器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// const rgbeloader = new RGBELoader(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// // 加载HDR贴图 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// rgbeloader.load('https://dm.static.elab-plus.com/miniProgram/environment.hdr', (texture) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	// 将HDR贴图设置为场景的环境贴图 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	texture.mapping = THREE.EquirectangularReflectionMapping; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 	scene.environment = texture; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 创建相机位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				camera = new THREE.PerspectiveCamera(95, window.screen.width / that.canvasHeight, 0.1, 10000 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// camera.up.set(0, 1, 0);//俯视状态,将相机的up向量设置为z轴负方向 {x:0,y:1,z:0} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// camera.position.set(that.cameraStarPosition.x, that.cameraStarPosition.y, that.cameraStarPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				scene.add(camera); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                that.camera = camera; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 环境光会均匀的照亮场景中的所有物体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				const ambientLight = new THREE.AmbientLight(0xFFEFE0, 3.5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				scene.add(ambientLight); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//平行光 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				const light = new THREE.DirectionalLight(0xFFF8E5, 2.5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.position.set(5, 7, 3); //default; light shining from top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.castShadow = true; // default false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 默认情况下光投影相机区域是一个长宽高为10x10x500的长方体区域,光源投射方向为通过坐标原点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.camera.left = -100; // 这个区域内产生阴影 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.camera.right  = 100; // 这个区域内产生阴影 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.camera.top  = 100; // 这个区域内产生阴影 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.camera.bottom  = -100; // 这个区域内产生阴影 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.mapSize.width = 8192; 	// 影响阴影的清晰度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				light.shadow.mapSize.height = 8192; // 影响阴影的清晰度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				scene.add(light); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//antialias 这个值得设置为false,不然IOS上截图会失效 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                renderer = that.renderer = new THREE.WebGLRenderer( {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					canvas:canvas3d,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					alpha: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					antialias:true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					preserveDrawingBuffer: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.shadowMap.enabled = true;//产生阴影 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 阴影属性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.outputEncoding = THREE.sRGBEncoding; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.outputColorSpace = THREE.SRGBColorSpace; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// renderer.toneMappingExposure = 0.1;//色调映射的曝光级别。默认是1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.toneMapping = THREE.NoToneMapping;//色调映射 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.physicallyCorrectLights = true;//关键参数,模拟物理光照影响,必须设置为true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                renderer.setPixelRatio(window.devicePixelRatio); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                renderer.setSize(window.screen.width, that.canvasHeight); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                container.appendChild( renderer.domElement ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls = new OrbitControls( camera, renderer.domElement ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.screenSpacePanning = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.enableDamping = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.minDistance = 0.5; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.maxDistance = 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.minPolarAngle = 0;// 默认0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.maxPolarAngle = Math.PI / 2; // 默认Math.PI,即可以向下旋转到的视角。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.target.set(  that.controlStarPosition.x, that.controlStarPosition.y, that.controlStarPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.enableZoom = true;//启用摄像机的缩放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.enablePan = false;//禁用摄像机平移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.enableRotate = true;//启用摄像机水平或垂直旋转 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.zoomToCursor = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// controls.update(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 监听相机移动事件-限制只能在当前空间范围内移动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.addEventListener('change', () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 检查相机位置是否超出边界框 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (boundary && !boundary.containsPoint(camera.position)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let clampedPosition = new THREE.Vector3( ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						boundary.clampPoint(camera.position,clampedPosition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(clampedPosition){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							camera.position.copy(clampedPosition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// controls.target.copy(clampedPosition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// controls.target = new THREE.Vector3( );; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// camera.lookAt(that.controlStarPosition.x,that.controlStarPosition.y,that.controlStarPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raycaster = new THREE.Raycaster(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				stats = new Stats(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				container.appendChild(stats.dom); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				stats.domElement.style.top = '100px'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				attendEvent();//注册监听事件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				starRender();	//启动渲染 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function tweenCameraAnmaChange (value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tweenCameraAnma = value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function attendEvent () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.domElement.addEventListener('touchstart', onPointerStart, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.domElement.addEventListener('touchmove', onPointerMove, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.domElement.addEventListener('touchend', onPointerUp, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//取消事件监听-避免二次进入时触发多次事件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function clearEvent(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.warn("**clearEvent****") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer && renderer.domElement && renderer.domElement.removeEventListener('touchstart', onPointerStart); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer && renderer.domElement && renderer.domElement.removeEventListener('touchmove', onPointerMove ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer && renderer.domElement && renderer.domElement.removeEventListener('touchend', onPointerUp ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 手指移动开始 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function onPointerStart(event){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				startTime = (new Date()).getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				fingerCount = event.touches.length;//手指个数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.log('开始触摸事件:',lon,fingerCount,camera.position.y) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (fingerCount === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 只有一个手指时记录当前点的坐标作为平移起始点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					onPointerDownMouseX = event.changedTouches[0].clientX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					onPointerDownMouseY = event.changedTouches[0].clientY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//持续触摸中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function onPointerMove( event ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				fingerCount = event.touches.length;//手指个数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//触摸结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function onPointerUp(event) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				fingerCount = event.touches.length;//手指个数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.warn("***触摸结束***",fingerCount,startTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(fingerCount==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let now = new Date().getTime() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (Math.abs(event.changedTouches[0].clientX - onPointerDownMouseX) < 10  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					&& Math.abs(event.changedTouches[0].clientY - onPointerDownMouseY) < 10  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					&& (now - startTime) < 300 ){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						checkIntersection(event); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//射线检测handle 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function checkIntersection(event) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    let x = (event.changedTouches[0].clientX / window.screen.width) * 2 - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    let y = -(event.changedTouches[0].clientY / that.canvasHeight) * 2 + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    mouse.x = x; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    mouse.y = y; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    //更新射线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    raycaster.setFromCamera(mouse, camera); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    let intersects = raycaster.intersectObjects(scene.children,true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.warn("***checkIntersection***",intersects.length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    if (intersects.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//找到最近的那个网格模型物体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let mesh = intersects.find((it) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(it.object && it.object.isMesh == true   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							&& it.object.parent && it.object.parent.name == 'actor' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							&& it.object.parent.visible == true){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//拾取到了视角,就不继续拾取了 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(mesh){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						moveActor(mesh.object.parent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					mesh = intersects.find((it) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(it.object && it.object.isInstancedMesh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							&& (it.object.name == '地板' || it.object.name == '花园') && it.object.visible == true){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//拾取到了地板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(mesh){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let floor = mesh.object; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let index = mesh.instanceId;//射线相交是的实例序号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let spaceId = that.gltfSpaces[index].spaceId;//获取选中实例的空间id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(floor.name == "花园"){//花园 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let selectMesh = that.gltfSpaces.find(it=>{return it.spaceType==14 && it.instancedMeshIndexList[0].instancedAtIndex==index}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							spaceId = selectMesh.spaceId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}else{//室内 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// floor.name = "地板"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let selectMesh = that.gltfSpaces.find(it=>{return it.spaceType!=14 && it.instancedMeshIndexList[0].instancedAtIndex==index}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							spaceId = selectMesh.spaceId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// let spaceId = that.gltfSpaces[index].spaceId;//获取选中实例的空间id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						console.warn("***checkIntersection-地板***",mesh,floor,index,spaceId,that.spaceId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						//当前拾取到的是本空间的底部-意味着用户点击了地板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(floor && spaceId == that.spaceId){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// console.warn("***checkIntersection-地板***",mesh,floor) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							moveCarmer(mesh.point); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//显示当前选中的视角或者隐藏所有视角-因为截图时不能保留视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function hideOrShowActor (type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.warn("***hideOrShowActor***",type) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(type=='hide'){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.actors.forEach(it=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						it.visible = false;//隐藏所有的视角的mesh模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(!that.currentActor){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						uni.showToast({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							icon: "none", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							title: "没有视角!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.actors.forEach(it=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(that.currentActor.userIndex==it.userIndex){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							it.visible = false;//隐藏即将切换到的视角的mesh模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							it.visible = true;//显示其他视角的模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//自动切换视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function switchActor () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!that.currentActor){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					uni.showToast({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						icon: "none", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						title: "没有当前视角!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!that.actors || that.actors.length==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					uni.showToast({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						icon: "none", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						title: "没有视角!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let index = that.currentActor.userIndex;//当前视角的序号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let nextIndex = (index + 1) % that.actors.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//移动到对应的视角去 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				moveActor(that.actors[nextIndex]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//移动到选中的位置-地板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function moveCarmer (point) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//还在动画中,不能点击切换 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(tweenCameraAnma == true){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _x =  point.x - camera.position.x;//x轴移动的距离 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _z =  point.z - camera.position.z;//z轴移动的距离 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// console.warn("***moveCarmer***",_x,_z) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let cameraNewPosition = {x:camera.position.x + _x,y:1.2,z:camera.position.z + _z}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let targetNewPosition = {x:controls.target.x + _x,y:1.2,z:controls.target.z + _z}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let oldUp = {x:0,y:1,z:0};	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let newUp = {x:0,y:1,z:0}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				moveTip(cameraNewPosition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// console.warn("**moveCarmer***",lon,JSON.stringify(cameraNewPosition),JSON.stringify(targetNewPosition)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tweenCamera(camera.position,controls.target,cameraNewPosition,targetNewPosition,oldUp,newUp,2000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//创建地标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function creatMoveTip(position){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!that.circleGroup){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.circleGroup = new THREE.Group(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let geometry = new THREE.CircleGeometry( 0.2, 32 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let material = new THREE.MeshBasicMaterial( { transparent: true } ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let circle = new THREE.Mesh( geometry, material ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					circle.position.set(position.x,0.01,position.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					circle.rotation.x = -Math.PI / 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// let geometry1 = new THREE.CircleGeometry( 0.4, 32 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// let circle2 = new THREE.Mesh( geometry1, material ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// circle2.position.set(position.x,0.01,position.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 使用贴图 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					const textureLoader = new THREE.TextureLoader(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					textureLoader.load('https://dm.static.elab-plus.com/miniProgram/circlemap1.png', function(texture) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						material.map = texture; // 将贴图应用于材质的map属性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						material.needsUpdate = true; // 更新材质 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.circleGroup.add(circle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					scene.add(that.circleGroup); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//移动地标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function moveTip(position){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!that.circleGroup){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.circleGroup = new THREE.Group(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let geometry = new THREE.CircleGeometry( 0.2, 32 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let material = new THREE.MeshBasicMaterial( { color: 0xffffff } ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let circle = new THREE.Mesh( geometry, material ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					circle.position.set(position.x,0.01,position.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					circle.rotation.x = -Math.PI / 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// let geometry1 = new THREE.CircleGeometry( 0.4, 32 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// let circle2 = new THREE.Mesh( geometry1, material ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// circle2.position.set(position.x,0.01,position.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.circleGroup.add(circle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					scene.add(that.circleGroup); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.circleGroup.children[0].position.set(position.x,0.01,position.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//移动视角点位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function moveActor (obj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				clearEvent();//注销事件监听 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				that.actors.forEach(it=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(obj.userIndex==it.userIndex){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						it.visible = false;//隐藏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						it.visible = true;//显示其他 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// console.warn("***moveActor***",obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				that.currentActor = obj;//记录下当前的视角对象 mesh网格模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let cameraNewPosition = obj.position; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let targetNewPosition = obj.targetNewPosition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let oldUp = {x:0,y:1,z:0};	//俯视 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let newUp = {x:0,y:1,z:0};	//正视 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.warn("**moveActor***",JSON.stringify(cameraNewPosition),JSON.stringify(targetNewPosition)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tweenCamera(camera.position,controls.target,cameraNewPosition,targetNewPosition,oldUp,newUp,2000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lon = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				setTimeout(()=> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					attendEvent() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 2000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//初始化点位视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function initActor(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!chooseMesh){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.error("[drawActor],没有选中的空间数据") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let spaceObj = chooseMesh;//获取选中的空间模型的相关数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!spaceObj.actors){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let defaulIndex = spaceObj.actors.findIndex(it=>it.isSelected==true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(defaulIndex == -1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					defaulIndex = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				that.actors = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				that.loader.load("https://dm.static.elab-plus.com/miniProgram/hs/gltf/sxtgltf.gltf",  ( gltf ) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					spaceObj.actors.forEach((actor,index)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let model = gltf.scene; // 获取模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let cloneModel = model.clone(true);//赋值模型,准备复用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cloneModel.children.map((v,i)=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							if(v.material){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								v.material = model.children[i].material.clone() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let cube = cloneModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.name = "actor"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.userType = "mesh"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						//新的摄像机的位置-新的摄像机角度是倾斜角度,所以z值需要计算,高度设置为模型高度的2倍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _actorLoaction = actor.actorLocation.split(',');//x y z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _actorTransform = actor.actorTransform.split(',');//旋转角度,取第三个值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _hd = THREE.MathUtils.degToRad(parseInt(_actorTransform[2]));//将度转化为弧度。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _hdY = THREE.MathUtils.degToRad(parseInt(_actorTransform[1]));//Y轴方向上将度转化为弧度。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(parseInt(_actorLoaction[1])==0){//X轴 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							_actorLoaction[1] = spaceObj.centerX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(parseInt(_actorLoaction[0])==0){//Y轴 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							_actorLoaction[0] = spaceObj.centerY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let X_C = _actorLoaction[0] - spaceObj.centerY;//X轴偏移量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let Y_C = _actorLoaction[1] - spaceObj.centerX;//Y轴偏移量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let px = spaceObj.centerX + X_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let py = spaceObj.centerY + Y_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let position = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							x:(parseInt(px))/100, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							y:1.2,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							z:-(parseInt(py))/100,//模型Y轴坐标系正负值跟webglZ轴是相反的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						//新的观察点的位置-取模型的中心点坐标,加上高度,由于模型都是贴地的,所以高度设置为1.2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let targetNewPosition = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							x:position.x + Math.sin(_hd), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							y:1.2 + Math.tan(_hdY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							z:(position.z - Math.cos(_hd)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.position.set(position.x,position.y,position.z) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.scale.set(2, 2, 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.userIndex = index; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.actorEum = index; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cube.targetNewPosition = targetNewPosition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						console.warn("*actors*",cube) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						scene.add(cube); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						that.actors.push(cube);//添加视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if(index == defaulIndex){//隐藏当前视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							cube.visible = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							that.currentActor = cube;//记录下当前的视角对象 mesh网格模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let param = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								type: 'CLK', //埋点类型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								clkId: 'clk_2cmina_23080411', //点击ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								clkName: 'visualangle_clk', //点击前往的页面名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								clkParams: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									locusName: "预制视角", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									type:that.actors[index].actorEum 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							util.trackRequest(param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//计算当前选中空间的平视时的观察点和摄像机的放置点位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function roamPositionHandle(lon=''){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!chooseMesh){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.error("[roamPositionHandle],没有选中的空间数据") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let spaceObj = chooseMesh;//获取选中的空间模型的相关数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//获取视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let defaultActor = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(spaceObj.actors && spaceObj.actors.length>0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					defaultActor = spaceObj.actors.find(it=>it.isSelected==true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(!defaultActor){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						defaultActor = spaceObj.actors[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _actorLoaction = defaultActor.actorLocation.split(',');//x y z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _actorTransform = defaultActor.actorTransform.split(',');//旋转角度,取第三个值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _hd = THREE.MathUtils.degToRad(parseInt(_actorTransform[2]) + lon);//将度转化为弧度。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let _hdY = THREE.MathUtils.degToRad(parseInt(_actorTransform[1]));//Y轴方向上将度转化为弧度。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(parseInt(_actorLoaction[1])==0){//X轴 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					_actorLoaction[1] = spaceObj.centerX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(parseInt(_actorLoaction[0])==0){//Y轴 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					_actorLoaction[0] = spaceObj.centerY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let X_C = _actorLoaction[0] - spaceObj.centerY;//X轴偏移量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let Y_C = _actorLoaction[1] - spaceObj.centerX;//Y轴偏移量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let px = spaceObj.centerX + X_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let py = spaceObj.centerY + Y_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//新的摄像机的位置-新的摄像机角度是倾斜角度,所以z值需要计算,高度设置为模型高度的2倍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let cameraNewPosition = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x:(parseInt(px))/100, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y:1.2,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z:-(parseInt(py))/100,//模型Y轴坐标系正负值跟webglZ轴是相反的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(cameraNewPosition){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let minX = 0,maxX = 0,minY = 0,maxY = 0;//0.1 是模型墙壁厚度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					minX = (spaceObj.centerX - (spaceObj.spaceWidth/2))/100 + 0.1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					maxX = (spaceObj.centerX + (spaceObj.spaceWidth/2))/100 - 0.1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					maxY = -((spaceObj.centerY - (spaceObj.spaceHeight/2))/100 + 0.1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					minY = -((spaceObj.centerY + (spaceObj.spaceHeight/2))/100 - 0.1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//新的坐标轴不在房间范围内,则不能移动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// console.warn("**roamPositionHandle-观察点不在范围中****",JSON.stringify(cameraNewPosition),minX,maxX,minY,maxY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if(cameraNewPosition.x<minX || cameraNewPosition.x>maxX 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					||cameraNewPosition.z<minY || cameraNewPosition.z>maxY){//不在房间范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _x = ((spaceObj.spaceWidth/2) - 15)*defaultActor.presentX + spaceObj.centerX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						let _z = ((spaceObj.spaceHeight/2) - 15)*defaultActor.presentY + spaceObj.centerY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cameraNewPosition.x = _x/100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						cameraNewPosition.z = - _z/100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						console.warn("**roamPositionHandle-观察点不在空间范围-强制修正观察点位置****",JSON.stringify(cameraNewPosition)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//新的观察点的位置-取模型的中心点坐标,加上高度,由于模型都是贴地的,所以高度设置为1.2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let targetNewPosition = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x:cameraNewPosition.x + Math.sin(_hd), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y:1.2 + Math.tan(_hdY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z:(cameraNewPosition.z - Math.cos(_hd)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return {cameraNewPosition,targetNewPosition} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//直接定位到摄像头位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function positionCamer(mesh=null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(mesh){//如果传入了模型,则取模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					chooseMesh = mesh; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!chooseMesh){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.error("[positionCamer],没有选中的空间数据") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!chooseMesh.actors || chooseMesh.actors.length==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					chooseMesh.actors = [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						actorLocation:chooseMesh.actorLocation, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						actorTransform:chooseMesh.actorTransform, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						isSelected:true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						presentX:chooseMesh.presentX, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						presentY:chooseMesh.presentY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				boundary = new THREE.Box3( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					new THREE.Vector3(chooseMesh.centerX/100 - chooseMesh.spaceWidth/100/2 + 0.1, 0, -chooseMesh.centerY/100 - chooseMesh.spaceHeight/100/2 + 0.1), // 边界框的最小点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					new THREE.Vector3(chooseMesh.centerX/100 + chooseMesh.spaceWidth/100/2 - 0.1, 2.7, -chooseMesh.centerY/100 + chooseMesh.spaceHeight/100/2 - 0.1) // 边界框的最大点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				initActor();//初始化视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let data = roamPositionHandle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let cameraNewPosition = data.cameraNewPosition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let targetNewPosition = data.targetNewPosition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				creatMoveTip(cameraNewPosition);//创建移动的地标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				camera.position.set(cameraNewPosition.x, cameraNewPosition.y, cameraNewPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				camera.lookAt(targetNewPosition.x,targetNewPosition.y,targetNewPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				controls.target.set(targetNewPosition.x,targetNewPosition.y,targetNewPosition.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// oldP  相机原来的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // oldT  target原来的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // newP  相机新的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // newT  target新的位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            function tweenCamera(oldP, oldT, newP, newT, oldUp, newUp, time=1000) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(JSON.stringify(oldP) == JSON.stringify(newP) && JSON.stringify(oldT) == JSON.stringify(newT)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.repeatFlag = false;//放开限制,可以再次点击 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (!chooseMesh) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.repeatFlag = false;//放开限制,可以再次点击 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tweenCameraAnma = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var tween = new TWEEN.Tween({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x1: oldP.x, // 相机x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y1: oldP.y, // 相机y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z1: oldP.z, // 相机z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x2: oldT.x, // 控制点的中心点x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y2: oldT.y, // 控制点的中心点y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z2: oldT.z,	// 控制点的中心点z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x3: oldUp.x, // 控制点的中心点x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y3: oldUp.y, // 控制点的中心点y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z3: oldUp.z  // 控制点的中心点z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.to({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			        x1: newP.x, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y1: newP.y, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z1: newP.z, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x2: newT.x, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y2: newT.y, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z2: newT.z, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					x3: newUp.x, // up向量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					y3: newUp.y, // 控制点的中心点y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					z3: newUp.z  // 控制点的中心点z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    }, time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.easing(TWEEN.Easing.Quadratic.InOut) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.onUpdate((object)=> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.position.x = object.x1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.position.y = object.y1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.position.z = object.z1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let newTarget = new THREE.Vector3(object.x3,object.y3,object.z3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.up.copy(newTarget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.lookAt(object.x2,object.y2,object.z2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// controls.target.x = object.x2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// controls.target.y = object.y2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// controls.target.z = object.z2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// controls.update(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// console.warn("****onUpdate**",object.x1,object.y1,object.z1,object.x2,object.y2,object.z2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}).onComplete(()=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					controls.target.x = newT.x; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					controls.target.y = newT.y; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					controls.target.z = newT.z; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//修正最后的视角 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let up = new THREE.Vector3(newUp.x,newUp.y,newUp.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.up.copy(up); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					camera.lookAt(controls.target.x,controls.target.y,controls.target.z); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					tweenCameraAnma = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					that.repeatFlag = false;//放开限制,可以再次点击 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 开始动画 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tween.start(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function stopRender () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				needRender = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			function starRender () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(needRender==true){//如果已经在渲染中了,则不能再次开启,避免渲染过多 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				needRender = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				render();//开始渲染 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            function render() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(needRender==false){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                TWEEN && TWEEN.update(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				stats.update(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//不处在动画过程中,则可以处理移动等动作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(tweenCameraAnma==false){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				renderer.render(scene, camera);//单次渲染 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				requestId = requestAnimationFrame(render, canvas3d); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (that.screenshotResolve) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// if(that.isIos){//IOS手机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						stopRender(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						that.screenshotResolve() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						that.screenshotResolve = null;//释放Promise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// }else{//安卓手机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	let gl = renderer.getContext(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	let frameBuffer = new THREE.Vector2(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	renderer.getDrawingBufferSize(frameBuffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	let pixelData = new Uint8Array(frameBuffer.x * frameBuffer.y * 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	//参考 Threejs WebGLRenderer.readRenderTargetPixels 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 		gl.readPixels(0, 0, frameBuffer.x, frameBuffer.y, gl.RGBA, gl.UNSIGNED_BYTE, pixelData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 		// 确保有像素,微信小程序安卓在进入子页面返回本页面后,再一次readPixels稳定无像素 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 		if (pixelData.some(i => i !== 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			stopRender(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			console.warn("***screenshotResolve-pixelData***"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			that.screenshotResolve([pixelData, frameBuffer.x, frameBuffer.y]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			that.screenshotResolve = null;//释放Promise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			frameBuffer = null;//清空内存中的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 			pixelData = null;//清空内存中的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// const eventChannel = this.getOpenerEventChannel(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// eventChannel && eventChannel.hasOwnProperty('on') && eventChannel.on('acceptDataFromOpenerPage', (data) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 	console.log('监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据',data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 	this.setHouseDetail(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		computed: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			curHouseObj() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return this.$store.state.curHouseObj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		watch: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			curHouseObj: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				handler(val) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (val) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						setTimeout(()=> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							this.setHouseDetail(val); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				immediate: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		methods: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			hideOrShowActor(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			switchActor(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			positionCamer(){}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			clearHandle(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.clearEvent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			showOrHideWebGl(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.$refs.viewMask.showOrHideWebGl();//显示或者隐藏AI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			save(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.$refs.viewMask.save();//下载 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 * 设置户型详情信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 * @param {Object} data 户型详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			setHouseDetail(data){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(data){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.id = this.curHouseObj.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.spaceId = this.$route.query.spaceId?this.$route.query.spaceId:''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.warn("***curHouseObj***",this.curHouseObj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 加载户型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.loadSpace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.curHouseObj = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 绘制空间-即地板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            async loadSpace(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.spaceList = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.wallIds = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!this.curHouseObj || !this.spaceId){//减少重复请求 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.warn("***数据错误***") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(this.curHouseObj){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const spaceDetail = this.curHouseObj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const spaceList = JSON.parse(spaceDetail.houseJson); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 交换centerX, centerY;上一页面已经处理过了,这里不在需要处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (let index = 0; index < spaceList.length; index++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var element = spaceList[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        // const centerX = JSON.parse(JSON.stringify(element.centerX)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						element.actors.forEach(actor=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let _actorLoaction = actor.actorLocation.split(',');//x y z 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let X_C = (parseInt(_actorLoaction[0]) || element.centerY) - element.centerY;//X轴偏移量-UE原因 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let Y_C = (parseInt(_actorLoaction[1]) || element.centerX) - element.centerX;//Y轴偏移量-向量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let _x = element.centerX + X_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let _z = element.centerY + Y_C; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// let _x = parseInt(_actorLoaction[1]) || element.centerX;//观察点 X轴坐标  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// let _z = parseInt(_actorLoaction[0]) || element.centerY;//观察点 Z轴坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let _presentX = (_x - element.centerX)/((element.spaceWidth/2) - 10);//10是墙壁厚度-单位cm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							let _presentY = (_z - element.centerY)/((element.spaceHeight/2) - 10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							//注意如果一开始就设置大超过空间大小,则处理成贴近空间边界 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							actor.presentX = Math.abs(_presentX)>1 ? (_presentX>1?1:-1) : _presentX;//观察点跟空间中心原点的距离比例 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							actor.presentY = Math.abs(_presentY)>1 ? (_presentY>1?1:-1) : _presentY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						element.wallMoveValue = "[0,0,0,0]" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.spaceList.push(element); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.wallIds.push(element.wallId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(element.spaceId == this.spaceId){ // 默认选中空间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.curSpaceObj = element; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(!this.curSpaceObj && this.spaceList.length > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        this.curSpaceObj = this.spaceList[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let curSpaceArea = parseFloat((this.curSpaceObj.spaceWidth * this.curSpaceObj.spaceHeight) / 10000).toFixed(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.navbar.title = this.curSpaceObj.spaceName + "  " + curSpaceArea + "㎡" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log("该户型空间数据:", this.spaceList);curSpaceArea 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log("当前选中的空间:", this.curSpaceObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.positionCamer(this.curSpaceObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.loaderSpaceArr(this.spaceList);//绘制地板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 获取墙体数据并且绘制墙体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.getHouseTypeSpaceWalls(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 获取墙体数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            async getHouseTypeSpaceWalls(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let data = {id:this.wallIds} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const res = await requestConfig('getHouseTypeSpaceWalls', data, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log("墙体数据:", res.list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let wallList = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(res.success){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    wallList = this.wallList = res.list; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let wallArr = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (let index = 0; index < wallList.length; index++) {//每个空间对应一个数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let element = JSON.parse(wallList[index].wallJson); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let space = this.spaceList.find(space=>space.spaceId==element.spaceId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.computeWallHandleOld(space,element);//提前计算 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (let i = 0; i < element.wallData.length; i ++) {//对应空间里面的4个方向的墙壁数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        let wallData = element.wallData[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						//对应方向的墙壁的墙体模型数据列表,每一面墙可能有多个模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (let j = 0; j < wallData.wallModelData.length; j ++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            let wallModelData = wallData.wallModelData[j]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            wallArr.push({spaceId:element.spaceId, wallModelData:wallModelData, wallDirection:wallData.wallDirection}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            // console.log("wallModelData", element,wallData.wallDirection, wallModelData.wallType ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.loadSpaceObjWalls(wallArr, wallList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.getOverallArrangementDetailsList();// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 加载单个空间墙体资源 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            async loadSpaceObjWalls(wallArr, wallList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 加载远程墙体模型资源 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let startTime = new Date().getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log("wallArr:", wallArr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let promise_list = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let realWallArr = this.preWallData(wallArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				let arrLength = realWallArr.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				realWallArr && realWallArr.forEach((item,index) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					promise_list.push( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							this.loadWallModels(item, wallList, arrLength , resolve); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Promise.all(promise_list).then(()=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					let endTime = new Date().getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					console.log("墙体模型全部加载完成,时间:",endTime - startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 设置空间数组的墙体信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// this.setSpaceListWallInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					this.$nextTick(()=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// this.moveMeshCenter(this.curSpaceObj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						this.progress = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// this.$refs.myLoading.showLoading("加载中..." + this.progress + '%') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						this.$nextTick(()=>{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							this.myLoadingStatus = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// this.$refs.myLoading.hideLoading(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							// this.meshRoam(this.curSpaceObj);//开始漫游,必须先选中模型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+</script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<style lang="scss" scoped> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @import "./webgl_rxdz_roam.scss"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* @import "@/common/css/common.css"; */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+</style> 
			 |