|
@@ -68767,14 +68767,17 @@ void main()
|
|
|
|
|
|
|
|
|
Utils.loadSkybox = function(path, oldSky ) {
|
|
|
- let camera, scene, parent;
|
|
|
+ let camera, scene, parent , cameraOrtho;
|
|
|
if(!oldSky){
|
|
|
parent = new Object3D("skybox_root");
|
|
|
|
|
|
camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000);
|
|
|
+ cameraOrtho = new OrthographicCamera(-1, 1, 1, -1, Potree.config.view.near, Potree.settings.cameraFar);
|
|
|
if(!window.axisYup) camera.up.set(0, 0, 1);//add
|
|
|
scene = new Scene();
|
|
|
- let skyGeometry = new BoxGeometry(10000,10000,10000);//(500, 500, 500);
|
|
|
+
|
|
|
+ let skyboxBgWidth = Potree.config.skyboxBgWidth;
|
|
|
+ let skyGeometry = new BoxBufferGeometry(skyboxBgWidth,skyboxBgWidth,skyboxBgWidth);
|
|
|
let skybox = new Mesh(skyGeometry, new ShaderMaterial({
|
|
|
vertexShader: Shaders['skybox.vs'],
|
|
|
fragmentShader: Shaders['skybox.fs'],
|
|
@@ -68789,6 +68792,8 @@ void main()
|
|
|
value: new Matrix4
|
|
|
}
|
|
|
},
|
|
|
+ depthTest:false,
|
|
|
+ depthWrite:false
|
|
|
}) );
|
|
|
|
|
|
scene.add(skybox);
|
|
@@ -68805,6 +68810,7 @@ void main()
|
|
|
camera = oldSky.camera,
|
|
|
scene = oldSky.scene;
|
|
|
parent = oldSky.parent;
|
|
|
+ cameraOrtho = oldSky.cameraOrtho;
|
|
|
}
|
|
|
|
|
|
let texture = texLoader$1.load( path, ()=>{
|
|
@@ -68819,7 +68825,7 @@ void main()
|
|
|
});
|
|
|
|
|
|
|
|
|
- return {camera, scene, parent};
|
|
|
+ return {camera, scene, parent, cameraOrtho};
|
|
|
};
|
|
|
|
|
|
Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera, viewer, pointclouds, pickParams = {} ) {
|
|
@@ -71526,7 +71532,7 @@ void main()
|
|
|
//navvis的shader在哪里 为什么不会抖动
|
|
|
}
|
|
|
,
|
|
|
- skyboxWidth : 10000,
|
|
|
+ skyboxBgWidth : 100 ,
|
|
|
|
|
|
renderLayers:{//渲染层,方便分批渲染管理,替代scene的创建。数字不代表顺序。(数字不能太大)
|
|
|
bg: 20,
|
|
@@ -114847,7 +114853,7 @@ ENDSEC
|
|
|
viewContainsPoints:[new Vector3(0,0,0)],
|
|
|
margin:{x:300, y:250} ,
|
|
|
} ];
|
|
|
-
|
|
|
+ let cylinderSkyGeo, oldSkyGeo;
|
|
|
|
|
|
|
|
|
let MergeEditor = {
|
|
@@ -114879,7 +114885,7 @@ ENDSEC
|
|
|
//见笔记:透明物体的材质设置
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ let oriEdgeStrength = viewer.outlinePass.edgeStrength;
|
|
|
{
|
|
|
|
|
|
this.transformControls = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{
|
|
@@ -114899,7 +114905,8 @@ ENDSEC
|
|
|
this.transformControls.setSize(1.5);
|
|
|
viewer.scene.scene.add(this.transformControls2);
|
|
|
viewer.setObjectLayers(this.transformControls2, 'layer2' );
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
let mouseDown = (e)=>{
|
|
|
|
|
|
viewer.outlinePass.edgeStrength = 0;//暂时消失线
|
|
@@ -114907,8 +114914,8 @@ ENDSEC
|
|
|
};
|
|
|
let mouseUp = (e)=>{
|
|
|
|
|
|
- this.updateEdgeStrength();
|
|
|
-
|
|
|
+ //this.updateEdgeStrength()
|
|
|
+ viewer.outlinePass.edgeStrength = oriEdgeStrength;
|
|
|
};
|
|
|
this.transformControls.addEventListener('mouseDown',mouseDown);
|
|
|
this.transformControls2.addEventListener('mouseDown',mouseDown);
|
|
@@ -115068,12 +115075,18 @@ ENDSEC
|
|
|
dragInfo = null;
|
|
|
this.clearTranCursor();
|
|
|
|
|
|
- this.updateEdgeStrength();
|
|
|
-
|
|
|
+ //this.updateEdgeStrength()
|
|
|
+ viewer.outlinePass.edgeStrength = oriEdgeStrength;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ /* viewer.addEventListener('background_changed',()=>{
|
|
|
+
|
|
|
+ }) */
|
|
|
+
|
|
|
},
|
|
|
|
|
|
|
|
@@ -115110,10 +115123,22 @@ ENDSEC
|
|
|
|
|
|
|
|
|
viewer.setControls(viewer.fpControls);
|
|
|
- viewer.viewports.find(e=>e.name == 'right').rotateSide = true;
|
|
|
- viewer.viewports.find(e=>e.name == 'top').alignment = true;
|
|
|
-
|
|
|
|
|
|
+ let rightViewport = viewer.viewports.find(e=>e.name == 'right');
|
|
|
+ let topViewport = viewer.viewports.find(e=>e.name == 'top');
|
|
|
+ topViewport.alignment = true;
|
|
|
+ rightViewport.rotateSide = true;
|
|
|
+ rightViewport.skyboxFixPos = true;
|
|
|
+ rightViewport.skyboxMinZoom = 10;
|
|
|
+ rightViewport.skyboxRenderFun = ()=>{// 使cube的一面永远正向镜头。 因侧视图的camera是ortho类型,需要平视mesh才不会拉伸
|
|
|
+ viewer.skybox.scene.children[0].rotation.copy(rightViewport.camera.rotation);
|
|
|
+ };
|
|
|
+ topViewport.skyboxRenderFun = ()=>{
|
|
|
+ viewer.skybox.scene.children[0].rotation.set(0,0,0);
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
viewer.viewports[1].layersAdd('layer2');
|
|
|
viewer.viewports[0].layersAdd('layer1');
|
|
|
viewer.setObjectLayers(this.transformControls, 'layer1' );
|
|
@@ -115131,8 +115156,11 @@ ENDSEC
|
|
|
viewer.compass.changeViewport(viewer.viewports[1]);
|
|
|
viewer.compass.setDomPos();
|
|
|
|
|
|
+
|
|
|
+ //this.changeSkyboxGeo(true)
|
|
|
},
|
|
|
|
|
|
+
|
|
|
leaveSplit(){
|
|
|
this.split = false;
|
|
|
this.SplitScreen.unSplit();
|
|
@@ -115153,7 +115181,7 @@ ENDSEC
|
|
|
viewer.compass.setDomPos();
|
|
|
this.secondCompass.setDisplay(false);
|
|
|
|
|
|
-
|
|
|
+
|
|
|
},
|
|
|
|
|
|
rotateSideCamera(angle){
|
|
@@ -115164,6 +115192,9 @@ ENDSEC
|
|
|
this.transformState = state;
|
|
|
this.clearTranCursor();
|
|
|
},
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
//---------------------------
|
|
|
|
|
|
/* writeToHistory(content){
|
|
@@ -115223,10 +115254,8 @@ ENDSEC
|
|
|
|
|
|
|
|
|
this.showModelOutline(model);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- this.updateEdgeStrength();
|
|
|
+
|
|
|
+ //this.updateEdgeStrength()
|
|
|
|
|
|
//console.log('selectModel', model)
|
|
|
|
|
@@ -115273,15 +115302,14 @@ ENDSEC
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- updateEdgeStrength(){
|
|
|
- if(!this.selected)return
|
|
|
- viewer.outlinePass.edgeStrength = 100;
|
|
|
- /* if(this.selected.isPointcloud){
|
|
|
+ /*updateEdgeStrength(){
|
|
|
+ if(!this.selected)return
|
|
|
+ if(this.selected.isPointcloud){
|
|
|
viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud// / this.selected.material.opacity
|
|
|
}else{
|
|
|
viewer.outlinePass.edgeStrength = edgeStrengths.glb
|
|
|
- } */
|
|
|
- },
|
|
|
+ }
|
|
|
+ },*/
|
|
|
focusOn(objects, duration = 400, fitBound=true, dontLookUp){
|
|
|
if(!(objects instanceof Array)){
|
|
|
objects = [objects];
|
|
@@ -147492,7 +147520,7 @@ ENDSEC
|
|
|
viewer.backgroundOpacity = 1;
|
|
|
|
|
|
|
|
|
- if(this.showHiddenPart){
|
|
|
+ if(this.showHiddenPart){ //几乎不会使用
|
|
|
viewports.forEach(e=>{
|
|
|
e.oldBeforeRender = e.beforeRender;
|
|
|
e.beforeRender = ()=>{
|
|
@@ -147526,63 +147554,67 @@ ENDSEC
|
|
|
});
|
|
|
|
|
|
}else {
|
|
|
+ //不渲染背景
|
|
|
scenes.forEach(scene=>{
|
|
|
scene.currentBackground = scene.background;
|
|
|
scene.background = null;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects
|
|
|
- this.changeVisibilityOfNonSelectedObjects( false , scenes);
|
|
|
-
|
|
|
-
|
|
|
- scenes.forEach(scene=>{
|
|
|
- scene.overrideMaterial = this.prepareMaskMaterial;
|
|
|
- });
|
|
|
-
|
|
|
- if(this.showHiddenPart){
|
|
|
- this.prepareMaskMaterial.uniforms[ "depthTexture" ].value = this.renderTargetDepthBuffer.texture;
|
|
|
- this.prepareMaskMaterial.uniforms[ "textureMatrix" ].value = this.textureMatrix;
|
|
|
- }
|
|
|
-
|
|
|
let colorType, colors = new Map() , opas = new Map();
|
|
|
- viewer.scene.pointclouds.forEach(e=>{ //先将点云透明度变为1,因为点云透明度莫名其妙会影响其r值//可能因为点云不受prepareMaskMaterial作用,渲染出的颜色各异
|
|
|
- colorType = e.material.activeAttributeName;
|
|
|
- e.material.activeAttributeName = 'color';
|
|
|
-
|
|
|
- colors.set(e, e.material.color);
|
|
|
- e.material.color = '#000000';
|
|
|
+ {//绘制选中部分
|
|
|
+ // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects
|
|
|
+ this.changeVisibilityOfNonSelectedObjects( false , scenes);
|
|
|
+
|
|
|
+ scenes.forEach(scene=>{
|
|
|
+ scene.overrideMaterial = this.prepareMaskMaterial;
|
|
|
+ });
|
|
|
|
|
|
- opas.set(e, e.material.opacity);
|
|
|
- e.material.opacity = 1;
|
|
|
- });
|
|
|
+ if(this.showHiddenPart){
|
|
|
+ this.prepareMaskMaterial.uniforms[ "depthTexture" ].value = this.renderTargetDepthBuffer.texture;
|
|
|
+ this.prepareMaskMaterial.uniforms[ "textureMatrix" ].value = this.textureMatrix;
|
|
|
+ }
|
|
|
+
|
|
|
+ //因为点云不受prepareMaskMaterial作用,所以手动将他们变为黑色不透明
|
|
|
+ viewer.scene.pointclouds.forEach(e=>{ //先将点云透明度变为1,因为点云透明度莫名其妙会影响其r值//
|
|
|
+ colorType = e.material.activeAttributeName;
|
|
|
+ e.material.activeAttributeName = 'color';
|
|
|
+
|
|
|
+ colors.set(e, e.material.color);
|
|
|
+ e.material.color = '#000000';
|
|
|
+
|
|
|
+ opas.set(e, e.material.opacity);
|
|
|
+ e.material.opacity = 1;
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
render2(this.renderTargetMaskBuffer);
|
|
|
|
|
|
- viewer.scene.pointclouds.forEach(e=>{//恢复
|
|
|
- e.material.activeAttributeName = colorType;
|
|
|
- e.material.color = colors.get(e);
|
|
|
- e.material.opacity = opas.get(e);
|
|
|
- });
|
|
|
|
|
|
- if(this.showHiddenPart){
|
|
|
- viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});
|
|
|
+ {//恢复
|
|
|
+ viewer.scene.pointclouds.forEach(e=>{
|
|
|
+ e.material.activeAttributeName = colorType;
|
|
|
+ e.material.color = colors.get(e);
|
|
|
+ e.material.opacity = opas.get(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ if(this.showHiddenPart){
|
|
|
+ viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});
|
|
|
+ }
|
|
|
+
|
|
|
+ scenes.forEach(scene=>{
|
|
|
+ scene.overrideMaterial = null;
|
|
|
+ scene.background = scene.currentBackground;
|
|
|
+ });
|
|
|
+ viewer.background = oldBG;
|
|
|
+ viewer.backgroundOpacity = oldBgOpacity;
|
|
|
+
|
|
|
+ this.changeVisibilityOfNonSelectedObjects( true , scenes);
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
- scenes.forEach(scene=>{
|
|
|
- scene.overrideMaterial = null;
|
|
|
- scene.background = scene.currentBackground;
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- this.changeVisibilityOfNonSelectedObjects( true , scenes);
|
|
|
-
|
|
|
-
|
|
|
|
|
|
+
|
|
|
+ //检测边缘并绘制
|
|
|
// 3. Apply Edge Detection Pass
|
|
|
this.quad.material = this.edgeDetectionMaterial;
|
|
|
this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;//this.renderTargetMaskDownSampleBuffer.texture;
|
|
@@ -147594,21 +147626,15 @@ ENDSEC
|
|
|
this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.hiddenEdgeColor; //this.tempPulseColor2;
|
|
|
|
|
|
|
|
|
- if(!this.showHiddenPart){
|
|
|
- scenes.forEach(scene=>{
|
|
|
- scene.background = scene.currentBackground;
|
|
|
- });
|
|
|
- }
|
|
|
- viewer.background = oldBG;
|
|
|
- viewer.backgroundOpacity = oldBgOpacity;
|
|
|
+
|
|
|
|
|
|
- let buffer = readBuffer;
|
|
|
+ let buffer;
|
|
|
if ( this.renderToScreen ) {
|
|
|
this.quad.material.transparent = true;
|
|
|
|
|
|
buffer = null;
|
|
|
renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
|
|
|
- render2(null,false);
|
|
|
+ render2(null,false); //普通绘制原场景
|
|
|
|
|
|
//绘制到全屏
|
|
|
let renderSize = renderer.getSize(new Vector2()); //是client大小
|
|
@@ -147616,37 +147642,17 @@ ENDSEC
|
|
|
renderer.setScissorTest( false );
|
|
|
|
|
|
}else {
|
|
|
+ buffer = readBuffer;
|
|
|
renderer.setClearColor( 0x000000, 0 );
|
|
|
renderer.clear();
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- renderer.setRenderTarget(buffer );
|
|
|
- renderer.render( this.scene, this.camera );
|
|
|
+
|
|
|
+ renderer.setRenderTarget( buffer );
|
|
|
+ renderer.render( this.scene, this.camera ); //将边缘覆盖上去
|
|
|
|
|
|
-
|
|
|
- //这次删掉
|
|
|
- /* // Blend it additively over the input texture
|
|
|
- this.quad.material = this.overlayMaterial;
|
|
|
- //this.overlayMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;
|
|
|
- this.overlayMaterial.uniforms[ "edgeTexture1" ].value = this.renderTargetEdgeBuffer1.texture;
|
|
|
- //this.overlayMaterial.uniforms[ "edgeTexture2" ].value = this.renderTargetEdgeBuffer2.texture;
|
|
|
- //this.overlayMaterial.uniforms[ "patternTexture" ].value = this.patternTexture;
|
|
|
- this.overlayMaterial.uniforms[ "edgeStrength" ].value = this.edgeStrength;
|
|
|
- //this.overlayMaterial.uniforms[ "edgeGlow" ].value = this.edgeGlow;
|
|
|
- //this.overlayMaterial.uniforms[ "usePatternTexture" ].value = this.usePatternTexture;
|
|
|
|
|
|
-
|
|
|
- if ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );
|
|
|
- //renderer.render( this.scene, camera, readBuffer, false );
|
|
|
-
|
|
|
- //改:清空readBuffer, 仅绘制出outline的部分
|
|
|
-
|
|
|
- renderer.setClearColor( 0x000000, 0 );
|
|
|
- renderer.setRenderTarget(readBuffer)
|
|
|
- renderer.clear()
|
|
|
- renderer.render( this.scene, this.camera );
|
|
|
- */
|
|
|
+
|
|
|
+
|
|
|
renderer.setRenderTarget(oldTarget);
|
|
|
renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
|
|
|
renderer.autoClear = oldAutoClear;
|
|
@@ -147692,16 +147698,14 @@ ENDSEC
|
|
|
|
|
|
' float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));',
|
|
|
' float viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );',
|
|
|
- ' float depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;',
|
|
|
+ ' float depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;', //决定是否为hiddenPart
|
|
|
' gl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);',
|
|
|
|
|
|
'}'
|
|
|
- ].join( '\n' )
|
|
|
- //scene.overrideMaterial
|
|
|
- //为什么画出来红色通道不为0,且depthTest似乎会改变红色通道的值
|
|
|
+ ].join( '\n' )
|
|
|
} );//没有绘制部分的颜色是clearColor,255
|
|
|
}else {
|
|
|
- return new MeshBasicMaterial({color:'#000000'})
|
|
|
+ return new MeshBasicMaterial({color:'#000000'}) //不检测深度,不判断遮挡
|
|
|
}
|
|
|
|
|
|
},
|
|
@@ -147769,7 +147773,7 @@ ENDSEC
|
|
|
float d = length( vec2(diff1, diff2) ) * edgeStrength;
|
|
|
float a1 = min(c1.g, c2.g);
|
|
|
float a2 = min(c3.g, c4.g);
|
|
|
- float visibilityFactor = min(a1, a2);
|
|
|
+ float visibilityFactor = min(a1, a2); //检测深度值,是否被遮挡
|
|
|
vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;
|
|
|
//gl_FragColor = vec4(0.0,1.0,0.0,1.0);
|
|
|
gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);
|
|
@@ -147833,7 +147837,7 @@ ENDSEC
|
|
|
|
|
|
},
|
|
|
|
|
|
- getOverlayMaterial: function () {
|
|
|
+ getOverlayMaterial: function () {//对边缘线进一步处理,已被废弃
|
|
|
|
|
|
return new ShaderMaterial( {
|
|
|
|
|
@@ -147897,6 +147901,39 @@ ENDSEC
|
|
|
OutlinePass.BlurDirectionX = new Vector2( 1.0, 0.0 );
|
|
|
OutlinePass.BlurDirectionY = new Vector2( 0.0, 1.0 );
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+
|
|
|
+
|
|
|
+ 渲染步骤:(没有showHiddenPart时)
|
|
|
+
|
|
|
+ 仅绘制选中部分,材质为普通的单色材质,颜色是黑色不透明。未绘制部分的clearColor是白色不透明。
|
|
|
+ (详见prepareMaskMaterial,输出的r要为0)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 然后在上面绘制的图中,根据r的差值,得到边缘线。
|
|
|
+
|
|
|
+
|
|
|
+ 正常绘制场景之后,将上面的边缘线覆盖于其上。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ (如果showHiddenPart,最开始还要先隐藏选中部分,这是为了得到非选中部分的深度值,然后再绘制选中部分时去比较选中和非选中部分之间的深度差异。以判断是否被遮挡。)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ */
|
|
|
+
|
|
|
/**
|
|
|
* @author mschuetz / http://mschuetz.at
|
|
|
*
|
|
@@ -148895,7 +148932,7 @@ ENDSEC
|
|
|
outlinePass.renderToScreen = true; //这样更流畅,不用ssaa了,缺点是outline有锯齿
|
|
|
outlinePass.enabled = false;
|
|
|
this.composer.addPass( outlinePass );
|
|
|
- outlinePass.edgeStrength = 10;
|
|
|
+ outlinePass.edgeStrength = 4;
|
|
|
outlinePass.edgeGlow = 0;
|
|
|
outlinePass.visibleEdgeColor = new Color("#09a1b3");
|
|
|
outlinePass.hiddenEdgeColor = new Color("#09a1b3");
|
|
@@ -151217,7 +151254,7 @@ ENDSEC
|
|
|
if(background instanceof Color){ //add
|
|
|
renderer.setClearColor(background, backgroundOpacity);
|
|
|
}else if(background === "skybox"){
|
|
|
- renderer.setClearColor( 0xffffff, 1 /* 0x000000, 0 */);
|
|
|
+ renderer.setClearColor(0x000000, 0 );
|
|
|
} else if (background === 'gradient') {
|
|
|
renderer.setClearColor(0x000000, 0);
|
|
|
} else if (background === 'black') {
|
|
@@ -151292,7 +151329,7 @@ ENDSEC
|
|
|
params_.target.viewport.set(left, bottom, width, height);
|
|
|
scissorTest && params_.target.scissor.set(left, bottom, width, height);
|
|
|
params_.target.scissorTest = scissorTest;
|
|
|
-
|
|
|
+ this.renderer.setRenderTarget(params_.target);
|
|
|
}else {
|
|
|
this.renderer.setViewport(left, bottom, width, height); //规定视口,影响图形变换(画布的使用范围)
|
|
|
scissorTest && this.renderer.setScissor( left, bottom, width, height );//规定渲染范围
|
|
@@ -151317,12 +151354,14 @@ ENDSEC
|
|
|
/* renderOverlay: this.renderOverlay.bind(this), */ force:!view.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
|
|
|
}));
|
|
|
}else {
|
|
|
- this.clear(params);
|
|
|
+ this.clear(params);
|
|
|
+ pRenderer.clearTargets(params);
|
|
|
+
|
|
|
+
|
|
|
|
|
|
this.renderBG(view);
|
|
|
|
|
|
- pRenderer.clearTargets(params);
|
|
|
-
|
|
|
+
|
|
|
if(Potree.settings.notAdditiveBlending){
|
|
|
params.renderBeforeCloud = true;
|
|
|
this.renderOverlay1(params); //先渲染不透明的model
|
|
@@ -151386,24 +151425,48 @@ ENDSEC
|
|
|
let backgroundOpacity = view.backgroundOpacity == void 0 ? viewer.backgroundOpacity : view.backgroundOpacity;//如果想完全透明,只需要backgroundOpacity为0
|
|
|
if(backgroundOpacity != 0){//绘制背景
|
|
|
if(background === "skybox"){
|
|
|
- //限制相机到原点的距离。
|
|
|
- let dir = new Vector3().subVectors(viewer.scene.cameraP.position, viewer.bound.center);
|
|
|
+ //限制相机到原点的距离。
|
|
|
+ let skyCamera = view.camera.type == "OrthographicCamera" ? viewer.skybox.cameraOrtho : viewer.skybox.camera;
|
|
|
let safeRatio = 0.02;
|
|
|
- let safeWidth = Potree.config.skyboxWidth * safeRatio / 2; //相机只能在这个范围内移动
|
|
|
- let length = dir.length();
|
|
|
- let aimRadius = easing.easeOutQuad(Math.min(length, safeWidth) , 0, safeWidth, safeWidth);
|
|
|
- dir.multiplyScalar(aimRadius/length);
|
|
|
- viewer.skybox.camera.position.copy(dir);
|
|
|
- viewer.skybox.camera.rotation.copy(viewer.scene.cameraP.rotation);
|
|
|
- viewer.skybox.camera.fov = viewer.scene.cameraP.fov;
|
|
|
- viewer.skybox.camera.aspect = viewer.scene.cameraP.aspect;
|
|
|
-
|
|
|
- viewer.skybox.parent.rotation.x = 0;
|
|
|
- viewer.skybox.parent.updateMatrixWorld();
|
|
|
-
|
|
|
- viewer.skybox.camera.updateProjectionMatrix();
|
|
|
+ let safeWidth = Potree.config.skyboxBgWidth * safeRatio / 2; //相机只能在这个范围内移动
|
|
|
+ if(!view.skyboxFixPos){ //允许不在全景图中心,允许位移造成一定程度畸变
|
|
|
+ let dir = new Vector3().subVectors(view.camera.position, viewer.bound.center);
|
|
|
+ let length = dir.length();
|
|
|
+ const moveMax = 100;
|
|
|
+ let aimRadius = easing.easeOutQuart(Math.min(length, moveMax) , 0, safeWidth, moveMax); //(x, startY, wholeY, maxX)
|
|
|
+ dir.multiplyScalar(aimRadius/length);
|
|
|
+ skyCamera.position.copy(dir);
|
|
|
+ }else {
|
|
|
+ skyCamera.position.set(0,0,0);
|
|
|
+ }
|
|
|
+
|
|
|
+ skyCamera.rotation.copy(view.camera.rotation);
|
|
|
+ skyCamera.aspect = view.camera.aspect;
|
|
|
+
|
|
|
+ if(view.camera.type == "OrthographicCamera"){ //调节zoom
|
|
|
+ skyCamera.left = view.camera.left; skyCamera.right = view.camera.right; skyCamera.top = view.camera.top; skyCamera.bottom = view.camera.bottom;
|
|
|
+
|
|
|
+ let a = Potree.config.skyboxBgWidth / 2 - safeWidth;
|
|
|
+ let minY = Math.max(skyCamera.right / a, skyCamera.top / a, view.skyboxMinZoom||0); //能够使skybox铺满画布的最小zoom. 提示:越远zoom越小
|
|
|
+ let maxY = Math.max(20, minY) ;//自定义一个 不会超过的最大实际zoom
|
|
|
+ //view.camera.zoom自变量的变化范围:
|
|
|
+ let minX = 1;
|
|
|
+ let maxX = 80;
|
|
|
+ let x = MathUtils.clamp(view.camera.zoom - minX, minX, maxX);
|
|
|
+ skyCamera.zoom = easing.easeOutCubic(x-minX, minY, maxY-minY, maxX-minX); //自变量范围从0开始,所以减去minX
|
|
|
+
|
|
|
+ //pos的范围先不管了 其实aimRadius是有误的,但效果还行
|
|
|
+ }else {
|
|
|
+ skyCamera.fov = view.camera.fov;
|
|
|
+ skyCamera.zoom = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ view.skyboxRenderFun && view.skyboxRenderFun();
|
|
|
|
|
|
- viewer.renderer.render(viewer.skybox.scene, viewer.skybox.camera);
|
|
|
+ skyCamera.updateProjectionMatrix();
|
|
|
+ skyCamera.updateMatrixWorld();
|
|
|
+ viewer.renderer.render(viewer.skybox.scene, skyCamera);
|
|
|
}else if(background === 'gradient'){
|
|
|
viewer.scene.cameraBG.layers.set(Potree.config.renderLayers.bg);
|
|
|
viewer.renderer.render(viewer.scene.scene, viewer.scene.cameraBG);
|