|
@@ -99,19 +99,34 @@
|
|
|
cancelAnimationFrame(requestId, this.canvas)
|
|
|
this.worker && this.worker.terminate()
|
|
|
if (this.renderer instanceof THREE.WebGLRenderer) {
|
|
|
- // 清空场景中所有对象的资源
|
|
|
+ // 遍历场景中的所有子对象,找到类型为Mesh的对象并移除
|
|
|
+ let deleList = this.scene.children.filter(object=>{
|
|
|
+ if (object instanceof THREE.Mesh) {
|
|
|
+ return object
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if(deleList && deleList.length>0){
|
|
|
+ this.scene.remove(...deleList);
|
|
|
+ }
|
|
|
this.scene.traverse(function(object) {
|
|
|
if (object instanceof THREE.Mesh) {
|
|
|
- object.geometry && object.geometry.dispose();
|
|
|
- object.material && object.material.dispose();
|
|
|
- object.texture && object.texture.dispose();
|
|
|
+ if(object.geometry && typeof(object.geometry.dispose)=='function'){
|
|
|
+ object.geometry.dispose();
|
|
|
+ }
|
|
|
+ if(object.material && typeof(object.material.dispose)=='function'){
|
|
|
+ object.material.dispose();
|
|
|
+ }
|
|
|
+ if(object.texture && typeof(object.texture.dispose)=='function'){
|
|
|
+ object.texture.dispose();
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
- this.renderer.dispose()
|
|
|
- this.renderer.forceContextLoss()
|
|
|
- this.renderer.context = null
|
|
|
- this.renderer.domElement = null
|
|
|
- this.renderer = null;
|
|
|
+ this.renderer.clear();
|
|
|
+ this.renderer.dispose();
|
|
|
+ this.renderer.forceContextLoss();
|
|
|
+ this.renderer.context = null;
|
|
|
+ this.renderer.domElement = null;
|
|
|
+ this.renderer = null;;
|
|
|
this.clearHandle()
|
|
|
}
|
|
|
TWEEN && TWEEN.removeAll();//清除所有的tween;
|
|
@@ -119,6 +134,9 @@
|
|
|
},
|
|
|
mounted(options) {
|
|
|
var that = this;
|
|
|
+ // alert("JavaScript 堆大小限制: "+performance.memory.jsHeapSizeLimit
|
|
|
+ // +"\n已使用的 JavaScript 堆大小: "+performance.memory.usedJSHeapSize
|
|
|
+ // +"\nJavaScript 堆的总大小: "+performance.memory.totalJSHeapSize);
|
|
|
console.warn("***webgl_rxdz_roam-options***",this.$route.query)
|
|
|
this.isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
|
|
|
// alert("***mounted-webgl_rxdz_roam***"+this.curHouseObj)
|
|
@@ -165,6 +183,7 @@
|
|
|
this.tweenCameraAnmaChange = tweenCameraAnmaChange;
|
|
|
this.switchActor = switchActor;
|
|
|
this.starRender = starRender;//对外暴露启动渲染的方法
|
|
|
+ this.stopRender = stopRender;//对外暴露停止渲染的方法
|
|
|
this.positionCamer = positionCamer;
|
|
|
if(this.curHouseObj && this.curHouseObj.id){
|
|
|
this.setHouseDetail(this.curHouseObj);
|
|
@@ -354,10 +373,9 @@
|
|
|
spaceId = selectMesh.spaceId;
|
|
|
}
|
|
|
// let spaceId = that.gltfSpaces[index].spaceId;//获取选中实例的空间id
|
|
|
- console.warn("***checkIntersection-地板***",mesh,floor,index,spaceId,that.spaceId)
|
|
|
+ console.warn("***checkIntersection-地板***",floor,index,spaceId,that.spaceId)
|
|
|
//当前拾取到的是本空间的底部-意味着用户点击了地板
|
|
|
if(floor && spaceId == that.spaceId){
|
|
|
- // console.warn("***checkIntersection-地板***",mesh,floor)
|
|
|
moveCarmer(mesh.point);
|
|
|
return false;
|
|
|
}
|
|
@@ -392,7 +410,6 @@
|
|
|
}
|
|
|
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.5,z:camera.position.z + _z};
|
|
|
let targetNewPosition = {x:controls.target.x + _x,y:1.5,z:controls.target.z + _z};
|
|
|
let oldUp = {x:0,y:1,z:0};
|
|
@@ -456,7 +473,7 @@
|
|
|
let oldUp = {x:0,y:1,z:0}; //俯视
|
|
|
let newUp = {x:0,y:1,z:0}; //正视
|
|
|
// moveTip(cameraNewPosition);
|
|
|
- console.warn("**moveActor***",JSON.stringify(cameraNewPosition),JSON.stringify(targetNewPosition))
|
|
|
+ // console.warn("**moveActor***",JSON.stringify(cameraNewPosition),JSON.stringify(targetNewPosition))
|
|
|
tweenCamera(camera.position,controls.target,cameraNewPosition,targetNewPosition,oldUp,newUp,2000);
|
|
|
lon = 0;
|
|
|
setTimeout(()=> {
|
|
@@ -519,15 +536,12 @@
|
|
|
z:(position.z - Math.cos(_hd)),
|
|
|
}
|
|
|
cube.position = position;
|
|
|
- // cube.scale.set(2, 2, 2);
|
|
|
cube.userIndex = index;
|
|
|
cube.actorEum = index;
|
|
|
cube.targetNewPosition = targetNewPosition;
|
|
|
- // cube.visible = false;
|
|
|
- console.warn("*actors*",cube,defaulIndex)
|
|
|
+ // console.warn("*actors*",cube,defaulIndex)
|
|
|
that.actors.push(cube);//添加视角
|
|
|
if(index == defaulIndex){//隐藏当前视角
|
|
|
- // cube.visible = false;
|
|
|
that.currentActor = cube;//记录下当前的视角对象 mesh网格模型
|
|
|
let param = {
|
|
|
type: 'CLK', //埋点类型
|
|
@@ -584,7 +598,6 @@
|
|
|
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;
|
|
@@ -689,7 +702,6 @@
|
|
|
// 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;
|
|
@@ -721,36 +733,12 @@
|
|
|
}
|
|
|
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;//清空内存中的数据
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
+ stopRender();
|
|
|
+ that.screenshotResolve()
|
|
|
+ that.screenshotResolve = null;//释放Promise
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -768,9 +756,9 @@
|
|
|
handler(val) {
|
|
|
if (val) {
|
|
|
// setTimeout(()=> {
|
|
|
- if(this.renderer){
|
|
|
- this.setHouseDetail(val);
|
|
|
- }
|
|
|
+ // if(this.renderer){
|
|
|
+ // this.setHouseDetail(val);
|
|
|
+ // }
|
|
|
// }, 1000);
|
|
|
}
|
|
|
},
|
|
@@ -867,7 +855,7 @@
|
|
|
}
|
|
|
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.spaceList);
|
|
|
console.log("当前选中的空间:", this.curSpaceObj);
|
|
|
this.positionCamer(this.curSpaceObj);
|
|
|
this.loaderSpaceArr(this.spaceList);//绘制地板
|
|
@@ -882,7 +870,7 @@
|
|
|
}else{
|
|
|
let data = {id:this.wallIds}
|
|
|
const res = await requestConfig('getHouseTypeSpaceWalls', data, true);
|
|
|
- console.log("墙体数据:", res.list)
|
|
|
+ // console.log("墙体数据:", res.list)
|
|
|
if(res.success){
|
|
|
wallList = this.wallList = res.list;
|
|
|
}
|