瀏覽代碼

fix: 点云透明度修整

xzw 2 年之前
父節點
當前提交
4ac879f582
共有 3 個文件被更改,包括 45 次插入17 次删除
  1. 41 15
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 3 1
      src/sdk/cover/index.js

+ 41 - 15
public/lib/potree/potree.js

@@ -69893,6 +69893,10 @@ void main() {
         
         // 设置点透明度
         changePointOpacity(num, canMoreThanOne) {
+            if(Potree.settings.editType == 'merge'){ //not AdditiveBlending
+                return this.material.opacity = num
+            }
+          
             //num:0-1   navvis用的是亮度
             if (num == void 0) {
                 num = this.temp.pointOpacity;
@@ -69902,7 +69906,8 @@ void main() {
              
             if (num == 1) {
                 this.material.opacity = 1;
-            } else {
+            } else { 
+
                 let str = (Potree.settings.sizeFitToLevel?'sizeFit:':'')+ (canMoreThanOne ? 'canMoreThanOne:':'') +this.temp.pointOpacity+':'+this.maxLevel+':'+this.nodeMaxLevel;
                 let value = this.temp.opacity[str];  //储存。防止每次渲染(反复切换density)都要算。
                 if(value){
@@ -72375,7 +72380,13 @@ void main() {
 
     		if (transparent){
     			gl.enable(gl.BLEND);
-    			gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
+                
+                if(params.notAdditiveBlending){
+                    gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); //NormalBlending 
+                }else {
+                    gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending   原本
+                }
+    			
     			gl.depthMask(false);
     			gl.disable(gl.DEPTH_TEST);
     		} else {
@@ -80889,10 +80900,16 @@ void main() {
                     Utils.screenPass.render(viewer.renderer, this.edlMaterial, params.target);
                 }else {
                     //渲染点云 (直接用rtEDL上的会失去抗锯齿)
-                    viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , {
-                        shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
-                        clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume))
-                    });  
+                    
+                    let prop =   {
+                            shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
+                            clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)) 
+                        };
+                    if(Potree.settings.editType == 'merge'){//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
+                        prop.depthTest = prop.depthWrite = true;
+                        prop.notAdditiveBlending = true;
+                    } 
+                    viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);  
                 }
             }        
               
@@ -129094,7 +129111,20 @@ ENDSEC
                         renderOverlay: this.renderOverlay.bind(this),  force:!view.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
                     }));
                 }
+
                 
+                view.render || this.clear(params);  
+                pRenderer.clearTargets(params);
+
+                //先渲染不透明的model:
+                if(this.objs.children.length){
+                    this.setCameraLayers(params.camera,  ['model'] );//先渲染模型后渲染点云,否则半透明的点云的blend没有混合模型的部分(但模型为何可以混合点云的部分?估计还是PotreeRenderer有问题)
+                    /* this.objs.children.forEach(e=>{
+                        this.updateVisible(e, 'renderOpa', e.opacity == 1)  
+                    }) */
+                    this.renderer.render(this.scene.scene, params.camera); 
+                }
+               
                 if(!view.noPointcloud ){
                     
                     //if(!params.target){ 
@@ -129115,8 +129145,7 @@ ENDSEC
                     params.backgroundColor = view.backgroundColor;
                     params.backgroundOpacity = view.backgroundOpacity;
                     
-                    view.render || this.clear(params);  
-                    pRenderer.clearTargets(params);
+                    
                     pRenderer.render(params); 
                     
                 } 
@@ -129173,19 +129202,15 @@ ENDSEC
             if(params.cameraLayers) cameraLayers = params.cameraLayers;
             else {
                 if(params.isMap)cameraLayers = ['bothMapAndScene'];
-                else cameraLayers = ['sceneObjects',  'model', 'bothMapAndScene' ];
+                else cameraLayers = ['sceneObjects', /*  'model', */ 'bothMapAndScene' ];
             }
             
+            
        
             if(cameraLayers.length){
                 this.setCameraLayers(camera,  cameraLayers, params.extraEnableLayers); //透明贴图层 skybox 、reticule marker 不能遮住测量线
                  
-                /* if(this.outlinePass.selectedObjects.some(e=>e.isModel).length){ 
-                    this.composer.render(this.scene.scene, camera);  
-                }else{ */
-                    this.renderer.render(this.scene.scene, camera); 
-                //} 
-                
+                this.renderer.render(this.scene.scene, camera);  
             }
               
             this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
@@ -130503,6 +130528,7 @@ ENDSEC
             let fileType =  fileInfo.objurl ? 'obj' : 'glb';
             let loadDone = (object, total, url)=>{
                 //object.scale.set(1,1,1);//先获取原始的大小时的boundingBox
+                object.opacity = 1; //初始化 记录
                 object.updateMatrixWorld();
                 let weight = Math.round((total / 1024 / 1024) * 100) / 100;
                 if(fileInfo.id != void 0)object.dataset_id = fileInfo.id;

文件差異過大導致無法顯示
+ 1 - 1
public/lib/potree/potree.js.map


+ 3 - 1
src/sdk/cover/index.js

@@ -543,6 +543,7 @@ export const enter = (dom, isLocal) => {
                 if(!props.isFirstLoad){
                     model.visible = false//先不显示,防止卡顿
                 }
+                
                 props.opacity < 100 && result.changeOpacity(props.opacity) 
                 
                 model.addEventListener('changeSelect',(e)=>{
@@ -642,10 +643,11 @@ export const enter = (dom, isLocal) => {
                     
                     if(model){
                         if(model.isPointcloud){
-                            setOp(model)  
+                            setOp(model)   
                         }else{
                             model.traverse(e=>e.material && setOp(e, opacity))
                         }
+                        model.opacity = opacity//记录在最外层
                     }
                      
                 },