|
@@ -20457,6 +20457,13 @@
|
|
|
visibleNodes.push(node);
|
|
|
/* level >= minLevel && */
|
|
|
pointcloud.visibleNodes.push(node);
|
|
|
+ if (Potree.sortNodesDis) {
|
|
|
+ //add
|
|
|
+ var nodePos = node.getBoundingSphere().center;
|
|
|
+ var toCam = new Vector3().subVectors(nodePos, camObjPos);
|
|
|
+ toCam.projectOnVector(camObjDir);
|
|
|
+ node.disSqToCamZ_ = toCam.lengthSq();
|
|
|
+ }
|
|
|
if (node._transformVersion === undefined) {
|
|
|
node._transformVersion = -1;
|
|
|
}
|
|
@@ -20609,6 +20616,15 @@
|
|
|
|
|
|
//add:
|
|
|
Potree.numVisiblePoints = numVisiblePoints;
|
|
|
+ if (Potree.sortNodesDis) {
|
|
|
+ //let s = performance.now()
|
|
|
+ for (var _pointcloud7 of pointclouds) {
|
|
|
+ _pointcloud7.visibleNodes.sort((a, b) => {
|
|
|
+ return b.disSqToCamZ_ - a.disSqToCamZ_;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //console.log(performance.now() - s)
|
|
|
+ }
|
|
|
return {
|
|
|
visibleNodes: visibleNodes,
|
|
|
numVisiblePoints: numVisiblePoints,
|
|
@@ -20693,10 +20709,10 @@
|
|
|
}
|
|
|
{
|
|
|
// DEPTH PASS
|
|
|
- for (var _pointcloud7 of visiblePointClouds) {
|
|
|
- var octreeSize = _pointcloud7.pcoGeometry.boundingBox.getSize(new Vector3()).x;
|
|
|
- var material = originalMaterials.get(_pointcloud7);
|
|
|
- var _depthMaterial = this.depthMaterials.get(_pointcloud7);
|
|
|
+ for (var _pointcloud8 of visiblePointClouds) {
|
|
|
+ var octreeSize = _pointcloud8.pcoGeometry.boundingBox.getSize(new Vector3()).x;
|
|
|
+ var material = originalMaterials.get(_pointcloud8);
|
|
|
+ var _depthMaterial = this.depthMaterials.get(_pointcloud8);
|
|
|
_depthMaterial.size = material.size;
|
|
|
_depthMaterial.minSize = material.minSize;
|
|
|
_depthMaterial.maxSize = material.maxSize;
|
|
@@ -20708,7 +20724,7 @@
|
|
|
_depthMaterial.screenHeight = height;
|
|
|
_depthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;
|
|
|
_depthMaterial.uniforms.octreeSize.value = octreeSize;
|
|
|
- _depthMaterial.spacing = _pointcloud7.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
|
|
|
+ _depthMaterial.spacing = _pointcloud8.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
|
|
|
_depthMaterial.classification = material.classification;
|
|
|
_depthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;
|
|
|
_depthMaterial.classificationTexture.needsUpdate = true;
|
|
@@ -20720,7 +20736,7 @@
|
|
|
_depthMaterial.clipMethod = material.clipMethod;
|
|
|
_depthMaterial.setClipBoxes(material.clipBoxes);
|
|
|
_depthMaterial.setClipPolygons(material.clipPolygons);
|
|
|
- _pointcloud7.material = _depthMaterial;
|
|
|
+ _pointcloud8.material = _depthMaterial;
|
|
|
}
|
|
|
viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, params.rtEDL || this.rtDepth, {
|
|
|
clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume)
|
|
@@ -20728,10 +20744,10 @@
|
|
|
}
|
|
|
{
|
|
|
// ATTRIBUTE PASS
|
|
|
- for (var _pointcloud8 of visiblePointClouds) {
|
|
|
- var _octreeSize = _pointcloud8.pcoGeometry.boundingBox.getSize(new Vector3()).x;
|
|
|
- var _material = originalMaterials.get(_pointcloud8);
|
|
|
- var _attributeMaterial = this.attributeMaterials.get(_pointcloud8);
|
|
|
+ for (var _pointcloud9 of visiblePointClouds) {
|
|
|
+ var _octreeSize = _pointcloud9.pcoGeometry.boundingBox.getSize(new Vector3()).x;
|
|
|
+ var _material = originalMaterials.get(_pointcloud9);
|
|
|
+ var _attributeMaterial = this.attributeMaterials.get(_pointcloud9);
|
|
|
_attributeMaterial.size = _material.size;
|
|
|
_attributeMaterial.minSize = _material.minSize;
|
|
|
_attributeMaterial.maxSize = _material.maxSize;
|
|
@@ -20744,7 +20760,7 @@
|
|
|
_attributeMaterial.shape = PointShape.CIRCLE;
|
|
|
_attributeMaterial.uniforms.visibleNodes.value = _material.visibleNodesTexture;
|
|
|
_attributeMaterial.uniforms.octreeSize.value = _octreeSize;
|
|
|
- _attributeMaterial.spacing = _pointcloud8.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
|
|
|
+ _attributeMaterial.spacing = _pointcloud9.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
|
|
|
_attributeMaterial.classification = _material.classification;
|
|
|
_attributeMaterial.uniforms.classificationLUT.value.image.data = _material.uniforms.classificationLUT.value.image.data;
|
|
|
_attributeMaterial.classificationTexture.needsUpdate = true;
|
|
@@ -20775,7 +20791,7 @@
|
|
|
_attributeMaterial.clipMethod = _material.clipMethod;
|
|
|
_attributeMaterial.setClipBoxes(_material.clipBoxes);
|
|
|
_attributeMaterial.setClipPolygons(_material.clipPolygons);
|
|
|
- _pointcloud8.material = _attributeMaterial;
|
|
|
+ _pointcloud9.material = _attributeMaterial;
|
|
|
}
|
|
|
var gl = this.gl;
|
|
|
|
|
@@ -20788,8 +20804,8 @@
|
|
|
depthWrite: false
|
|
|
});
|
|
|
}
|
|
|
- for (var [_pointcloud9, _material2] of originalMaterials) {
|
|
|
- _pointcloud9.material = _material2;
|
|
|
+ for (var [_pointcloud10, _material2] of originalMaterials) {
|
|
|
+ _pointcloud10.material = _material2;
|
|
|
}
|
|
|
if (viewer.background === "skybox") {
|
|
|
viewer.renderer.setClearColor(0x000000, 0);
|
|
@@ -33981,9 +33997,17 @@
|
|
|
if (params.notAdditiveBlending) {
|
|
|
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); //NormalBlending
|
|
|
/* gl.enable(gl.DEPTH_TEST);
|
|
|
- gl.depthMask(true); //如果不开启depthWrite, 深度会错乱。 */ //无解
|
|
|
- gl.disable(gl.DEPTH_TEST);
|
|
|
- gl.depthMask(true);
|
|
|
+ gl.depthMask(true); //如果不开启depthWrite, 深度会错乱。 */ //无解
|
|
|
+ /* gl.disable(gl.DEPTH_TEST);
|
|
|
+ gl.depthMask(true); //depthWrite */
|
|
|
+ gl.enable(gl.DEPTH_TEST);
|
|
|
+ gl.depthMask(false);
|
|
|
+ /* gl.enable(gl.DEPTH_TEST);
|
|
|
+ gl.depthMask(true); */
|
|
|
+
|
|
|
+ /* 几种选择:
|
|
|
+ 1 都开启: 当opacity很小时发黑且遮住其他透明物体
|
|
|
+ 2 开启depthTest关闭depthWrite 自己深度错乱,前排挡不住后排 */
|
|
|
} else {
|
|
|
gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending 原本
|
|
|
gl.disable(gl.DEPTH_TEST);
|
|
@@ -41603,9 +41627,7 @@
|
|
|
this.setSelected(false, 'edgeLabel');
|
|
|
});
|
|
|
edgeLabel.addEventListener('click', e => {
|
|
|
- //setTimeout(()=>{
|
|
|
- this.isNew || viewer.measuringTool.isAdding || e.button == MOUSE.LEFT || viewer.focusOnObject(this, 'measure');
|
|
|
- //},1)//延时是因为(点右键)刚结束绘制会触发
|
|
|
+ this.isNew || viewer.measuringTool.isAdding || e.button == MOUSE.LEFT && viewer.focusOnObject(this, 'measure');
|
|
|
});
|
|
|
}
|
|
|
edgeLabel.visible = false;
|
|
@@ -42301,8 +42323,7 @@
|
|
|
this.edge.addEventListener('mouseleave', mouseleave);
|
|
|
this.edge.addEventListener('click', e => {
|
|
|
var now = Date.now();
|
|
|
- if (now - this.lastDropTime < 100 || this.isNew || e.button !== MOUSE.LEFT) return; //防止拖拽marker时误触导致focus, 以及点到marker不focus
|
|
|
-
|
|
|
+ if (now - this.lastDropTime < 100 || this.isNew || e.button !== MOUSE.LEFT) return;
|
|
|
if (this.addOrRemovePoint) {
|
|
|
viewer.measuringTool.history.beforeChange(this);
|
|
|
var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
|
|
@@ -57634,18 +57655,16 @@
|
|
|
if (rtEDL) {
|
|
|
//借用rtEDL存储深度信息
|
|
|
renderer.setRenderTarget(rtEDL);
|
|
|
- if (visiblePointClouds2.length > 0) {
|
|
|
- //渲染scenePointCloud到rtEDL
|
|
|
- pRenderer.render(viewer.scene.scenePointCloud, camera, rtEDL, {
|
|
|
- shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
- clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
|
|
|
- transparent: true,
|
|
|
- //如果点云透明需要透明
|
|
|
- notAdditiveBlending: Potree.settings.notAdditiveBlending
|
|
|
- });
|
|
|
- }
|
|
|
- if (Potree.settings.intersectOnObjs) {
|
|
|
+ var renderModel = renderBeforeCloud => {
|
|
|
// model也要渲染到rtEDL
|
|
|
+ if (!Potree.settings.intersectOnObjs) return;
|
|
|
+ viewer.objs.traverse(object => {
|
|
|
+ if (object.material) {
|
|
|
+ var transparent = object.material.opacity < 1 || object.material.mapTransparent || !object.material.depthTest || !object.material.depthWrite; //不写入深度的往往最后来比较
|
|
|
+ Potree.Utils.updateVisible(object, 'renderOpa', renderBeforeCloud != transparent);
|
|
|
+ //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
|
|
|
+ }
|
|
|
+ }); //ground的材质中opacity为1,所以被当做不透明了
|
|
|
Potree.Utils.setCameraLayers(camera, ['model', 'light']);
|
|
|
viewer.objs.traverse(e => {
|
|
|
if (e.material) e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true;
|
|
@@ -57655,7 +57674,19 @@
|
|
|
if (e.material) e.material.depthWrite = e._OlddepthWrite;
|
|
|
});
|
|
|
//缺点:半透明的model 就算完全透明, 也会遮住测量线
|
|
|
+ };
|
|
|
+ renderModel(true);
|
|
|
+ if (visiblePointClouds2.length > 0) {
|
|
|
+ //渲染scenePointCloud到rtEDL
|
|
|
+ pRenderer.render(viewer.scene.scenePointCloud, camera, rtEDL, {
|
|
|
+ shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
+ clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
|
|
|
+ transparent: true,
|
|
|
+ //如果点云透明需要透明
|
|
|
+ notAdditiveBlending: Potree.settings.notAdditiveBlending
|
|
|
+ });
|
|
|
}
|
|
|
+ renderModel(false);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -57669,42 +57700,44 @@
|
|
|
//放大镜显示点云
|
|
|
e.visible = e.oldVisi;
|
|
|
});
|
|
|
- if (showPointClouds) {
|
|
|
+ {
|
|
|
//绘制点云到画布
|
|
|
if (useEDL) {
|
|
|
//设置edlMaterial //Features.EXT_DEPTH不支持的话不会到这一块
|
|
|
-
|
|
|
- var uniforms = this.edlMaterial.uniforms;
|
|
|
- uniforms.resolution.value.copy(resolution);
|
|
|
- uniforms.edlStrength.value = viewer.edlStrength;
|
|
|
- uniforms.radius.value = viewer.edlRadius;
|
|
|
- uniforms.useEDL.value = 1; //add
|
|
|
-
|
|
|
- var proj = camera.projectionMatrix;
|
|
|
- var projArray = new Float32Array(16);
|
|
|
- projArray.set(proj.elements);
|
|
|
- uniforms.uProj.value = projArray;
|
|
|
- uniforms.uEDLColor.value = rtEDL.texture;
|
|
|
- uniforms.opacity.value = viewer.edlOpacity; // HACK
|
|
|
-
|
|
|
- Utils.screenPass.render(renderer, this.edlMaterial, target); //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
|
|
|
+ if (showPointClouds) {
|
|
|
+ var uniforms = this.edlMaterial.uniforms;
|
|
|
+ uniforms.resolution.value.copy(resolution);
|
|
|
+ uniforms.edlStrength.value = viewer.edlStrength;
|
|
|
+ uniforms.radius.value = viewer.edlRadius;
|
|
|
+ uniforms.useEDL.value = 1; //add
|
|
|
+
|
|
|
+ var proj = camera.projectionMatrix;
|
|
|
+ var projArray = new Float32Array(16);
|
|
|
+ projArray.set(proj.elements);
|
|
|
+ uniforms.uProj.value = projArray;
|
|
|
+ uniforms.uEDLColor.value = rtEDL.texture;
|
|
|
+ uniforms.opacity.value = viewer.edlOpacity; // HACK
|
|
|
+
|
|
|
+ Utils.screenPass.render(renderer, this.edlMaterial, target); //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
|
|
|
+ }
|
|
|
} else if (Potree.settings.useRTPoint && rtEDL && visiblePointClouds2.every(e => e.material.opacity >= 1)) {
|
|
|
- //半透明点云在clearAlpha为非1的状态下截图 或 在useRTPoints时绘制到屏幕上透明度不对,亮度变低 。 只能在半透明时关闭一下useRTPoint
|
|
|
+ //半透明点云在clearAlpha为非1的状态下截图 或 在useRTPoints时绘制到屏幕上透明度不对,亮度变低 。还会遮住别的半透明物体。 只能在半透明时关闭一下useRTPoint
|
|
|
this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture;
|
|
|
if (this.recoverToScreenMat.defines.useDepth) {
|
|
|
this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture;
|
|
|
}
|
|
|
- Utils.screenPass.render(renderer, this.recoverToScreenMat, target /* , Potree.settings.useFxaa && viewer.composer2 */);
|
|
|
params.drawedModelOnRT = Potree.settings.intersectOnObjs;
|
|
|
+ Utils.screenPass.render(renderer, this.recoverToScreenMat, target /* , Potree.settings.useFxaa && viewer.composer2 */);
|
|
|
} else {
|
|
|
//渲染点云 (直接用rtEDL上的会失去抗锯齿, 导致频闪、密集时出现条纹, 自己写抗锯齿也要渲染好几次。另外透明度也要处理下)
|
|
|
-
|
|
|
- var prop = {
|
|
|
- shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
- clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
|
|
|
- notAdditiveBlending: Potree.settings.notAdditiveBlending //add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
|
|
|
- };
|
|
|
- pRenderer.render(viewer.scene.scenePointCloud, camera, null, prop);
|
|
|
+ if (showPointClouds) {
|
|
|
+ var prop = {
|
|
|
+ shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
+ clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
|
|
|
+ notAdditiveBlending: Potree.settings.notAdditiveBlending //add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
|
|
|
+ };
|
|
|
+ pRenderer.render(viewer.scene.scenePointCloud, camera, null, prop);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
visiblePointClouds2.forEach(e => {
|
|
@@ -70271,6 +70304,7 @@
|
|
|
return models.find(e => e.dataset_id == id);
|
|
|
},
|
|
|
changeModelPointCount(object, type) {
|
|
|
+ if (object.fileType == '3dTiles' || object.isPointcloud) return;
|
|
|
var posCount, texArea;
|
|
|
if (type == 'add') {
|
|
|
var o = viewer.getObjectPointCount(object);
|
|
@@ -70290,9 +70324,8 @@
|
|
|
this.updateMemoryUsage()
|
|
|
},{once:true})
|
|
|
}) */
|
|
|
- if (model.fileType != '3dTiles') {
|
|
|
- this.changeModelPointCount(model, 'add');
|
|
|
- }
|
|
|
+
|
|
|
+ this.changeModelPointCount(model, 'add');
|
|
|
this.updateMemoryUsage();
|
|
|
},
|
|
|
removeModel(model) {
|
|
@@ -70325,9 +70358,7 @@
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
- if (model.fileType != '3dTiles') {
|
|
|
- this.changeModelPointCount(model, 'sub');
|
|
|
- }
|
|
|
+ this.changeModelPointCount(model, 'sub');
|
|
|
this.updateMemoryUsage();
|
|
|
},
|
|
|
selectModel(model) {
|
|
@@ -83382,39 +83413,6 @@
|
|
|
viewer: viewer
|
|
|
});
|
|
|
}
|
|
|
- createHackMesh() {
|
|
|
- //为了防止无depthTex的全景在pick点云时画面中仅有一个材质时会黑屏,所以在镜头前再加一个mesh。具体bug表现见bug记录。
|
|
|
- if (this.scene.pointclouds.every(e => e.hasDepthTex) || viewer.images360.panos.length == 0) return;
|
|
|
- var mesh = new Mesh(viewer.images360.panos[0].marker.geometry, new MeshBasicMaterial({
|
|
|
- color: "#F00",
|
|
|
- side: 2 /* ,depthTest:false */
|
|
|
- }));
|
|
|
- Potree.Utils.updateVisible(mesh, 'show', false);
|
|
|
- this.images360.node.add(mesh);
|
|
|
- var updatePos = () => {
|
|
|
- var dir = this.mainViewport.view.direction;
|
|
|
- var radius = this.images360.cube.scale.length();
|
|
|
- mesh.position.copy(this.mainViewport.view.position).add(dir.multiplyScalar(radius)); //放置skybox之外
|
|
|
- };
|
|
|
- this.addEventListener('camera_changed', e => {
|
|
|
- var _e$changeInfo, _e$changeInfo2;
|
|
|
- if (e.viewport.name == 'MainView' && Potree.settings.displayMode == 'showPanos' && !this.images360.currentPano.depthTex && ((_e$changeInfo = e.changeInfo) !== null && _e$changeInfo !== void 0 && _e$changeInfo.positionChanged || (_e$changeInfo2 = e.changeInfo) !== null && _e$changeInfo2 !== void 0 && _e$changeInfo2.quaternionChanged)) {
|
|
|
- updatePos();
|
|
|
- }
|
|
|
- });
|
|
|
- var judge = () => {
|
|
|
- var _this$images360$curre;
|
|
|
- if (!((_this$images360$curre = this.images360.currentPano) !== null && _this$images360$curre !== void 0 && _this$images360$curre.depthTex) && Potree.settings.displayMode == 'showPanos') {
|
|
|
- Potree.Utils.updateVisible(mesh, 'show', true);
|
|
|
- } else {
|
|
|
- Potree.Utils.updateVisible(mesh, 'show', false);
|
|
|
- }
|
|
|
- };
|
|
|
- this.images360.addEventListener('flyToPanoDone', judge);
|
|
|
- this.images360.addEventListener('endChangeMode', judge);
|
|
|
-
|
|
|
- //不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
|
|
|
- }
|
|
|
renderOverlay2(params) {
|
|
|
//渲染剩余部分
|
|
|
var renderer = params.renderer || this.renderer;
|
|
@@ -85155,7 +85153,39 @@
|
|
|
var r = result[0];
|
|
|
return r && r.score > 1 ? result[0].item : null;
|
|
|
}
|
|
|
+ createHackMesh() {
|
|
|
+ //为了防止无depthTex的全景在pick点云时画面中仅有一个材质时会黑屏,所以在镜头前再加一个mesh。具体bug表现见bug记录。
|
|
|
+ if (this.scene.pointclouds.every(e => e.hasDepthTex) || viewer.images360.panos.length == 0) return;
|
|
|
+ var mesh = new Mesh(viewer.images360.panos[0].marker.geometry, new MeshBasicMaterial({
|
|
|
+ color: "#F00",
|
|
|
+ side: 2 /* ,depthTest:false */
|
|
|
+ }));
|
|
|
+ Potree.Utils.updateVisible(mesh, 'show', false);
|
|
|
+ this.images360.node.add(mesh);
|
|
|
+ var updatePos = () => {
|
|
|
+ var dir = this.mainViewport.view.direction;
|
|
|
+ var radius = this.images360.cube.scale.length();
|
|
|
+ mesh.position.copy(this.mainViewport.view.position).add(dir.multiplyScalar(radius)); //放置skybox之外
|
|
|
+ };
|
|
|
+ this.addEventListener('camera_changed', e => {
|
|
|
+ var _e$changeInfo, _e$changeInfo2;
|
|
|
+ if (e.viewport.name == 'MainView' && Potree.settings.displayMode == 'showPanos' && !this.images360.currentPano.depthTex && ((_e$changeInfo = e.changeInfo) !== null && _e$changeInfo !== void 0 && _e$changeInfo.positionChanged || (_e$changeInfo2 = e.changeInfo) !== null && _e$changeInfo2 !== void 0 && _e$changeInfo2.quaternionChanged)) {
|
|
|
+ updatePos();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ var judge = () => {
|
|
|
+ var _this$images360$curre;
|
|
|
+ if (!((_this$images360$curre = this.images360.currentPano) !== null && _this$images360$curre !== void 0 && _this$images360$curre.depthTex) && Potree.settings.displayMode == 'showPanos') {
|
|
|
+ Potree.Utils.updateVisible(mesh, 'show', true);
|
|
|
+ } else {
|
|
|
+ Potree.Utils.updateVisible(mesh, 'show', false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ this.images360.addEventListener('flyToPanoDone', judge);
|
|
|
+ this.images360.addEventListener('endChangeMode', judge);
|
|
|
|
|
|
+ //不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
|
|
|
+ }
|
|
|
/* createRoomEv(){
|
|
|
|
|
|
const environment = new RoomEnvironment();
|