//xzw add import browser from './utils/browser.js' const config = {//配置参数 不可修改 displayMode:{ showPointCloud:{ atPano:{ showPoint : true, showSkybox: false, pointUsePanoTex : false }, transition:{ showPoint: true, showSkybox: false, pointUsePanoTex: false }, canLeavePano: true //是否能离开pano位置 }, showPanos:{ atPano:{ showPoint : false, showSkybox: true, pointUsePanoTex : false }, transition:{ //showPoint: true, showSkybox: true, //pointUsePanoTex: true //是否使用全景贴图 }, canLeavePano: false }, showBoth:{ atPano:{ showPoint : true, showSkybox: true, pointUsePanoTex : false //? }, transition:{ showPoint: true, showSkybox: true, pointUsePanoTex: true }, canLeavePano: true //是否能离开pano位置 离开后自动变为showPointCloud }, //test: pointUsePanoTex:{ //---静止时调点云 atPano:{ showPoint : true, showSkybox: false, pointUsePanoTex : true }, transition:{ showPoint: true, showSkybox: true, pointUsePanoTex: true //是否使用全景贴图 }, canLeavePano: false }, }, urls:{ //localTextures:'../resources/textures/', prefix1: 'https://laser-oss.4dkankan.com',//oss prefix2: 'https://testlaser.4dkankan.com', prefix3: 'https://4dkk.4dage.com', prefix4: 'https://uat-laser.4dkankan.com',//test.4dkankan prefix5: 'https://laser.4dkankan.com/backend', prefix6: 'https://mix3d.4dkankan.com/backend', //融合 prefix7: 'https://xfhd.4dkankan.com/backend', //融合 }, transitionsTime:{ flyMinTime : 650 , // 毫秒/米 flytimeDistanceMultiplier: 120 , } , view:{ fov:70, //navvis:50 near:0.1, far: 10000, }, map:{//mapViewer mapHeight : -1000,//要比点云低。最低 cameraHeight : 1000, //最高 ,注意(如sitemodel)其他的物体不能超过这个高度 }, minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能 tiles3DMaxMemory: 100,//M. 最大支持3dTiles的内存大小 超出会崩溃。 改太小太大都会卡,太大崩溃 pointDensity:{ magnifier:{ maxLevelPercent: 1, pointBudget : 1*1000*1000, //至少显示这么多 minNodeSize : 5, //pick时调高精度 }, panorama:{//显示全景时的漫游。因为点只能显示1个像素的大小,所以必须很密集,但又要限制点的数量 maxLevelPercent: 0.6, pointBudget : /* 4*1000*1000// */browser.isMobile() ? 0.2*1000*1000 : 0.4*1000*1000, //点云总最大数 minNodeSize : 100, }, fourViewports:{//分四屏时防止卡顿 maxLevelPercent: 0.9, pointBudget :3*1000*1000, // 只要限制这个就足够 (为什么分屏focus区域不同会闪烁,navvis不会)(navvis:maxLevel:5,pointBudget:1*1000*1000) minNodeSize : 70, }, fourViewportsMain:{//分四屏时防止卡顿 maxLevelPercent: 0.9, pointBudget :3*1000*1000, // 只要限制这个就足够 (为什么分屏focus区域不同会闪烁,navvis不会)(navvis:maxLevel:5,pointBudget:1*1000*1000) minNodeSize : 70, } , panoEdit:{ maxLevelPercent: 1, //在远处时由于pointBudget限制而展示稀疏,凑近时就变为最高质量了 pointBudget :4*1000*1000, //要使点云达到200个以上时还不卡 percentByUser:true, minNodeSize : 80 , //点云多的话远处的尽量就不可见吧 }, low:{//highPerformance maxLevelPercent: 0.4, //最小为0 percentByUser:true, //如果用户定义了percent,使用用户的 pointBudget : browser.isMobile() ? 1*1000*1000 : 2*1000*1000, minNodeSize : 40 / window.devicePixelRatio , }, middle:{//balanced //不同场景相同级别所产生的numVisibleNodes和numVisiblePoints不同,如果分层比较细,可能要到level8才能看清,那么level5看到的点就很大且很少,如隧道t-e2Kb2iU maxLevelPercent: 0.7, percentByUser:true, pointBudget: browser.isMobile() ? 1.5*1000*1000 : 3.5*1000*1000, minNodeSize : 30 / window.devicePixelRatio , }, high:{//highQuality maxLevelPercent: 1, percentByUser:true, pointBudget:browser.isMobile() ? 3*1000*1000 : 6*1000*1000, //原本最高是8,但是大部分电脑都太卡了,降 minNodeSize : 20 / window.devicePixelRatio , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了) }, screenshot:{ maxLevelPercent: 1, pointBudget: browser.isMobile() ? 4*1000*1000 : 10*1000*1000, //一般只有电脑需要截图,手机的加载多会崩 minNodeSize : 40 / window.devicePixelRatio , }, screenshot2:{ maxLevelPercent: 1, pointBudget: browser.isMobile() ? 8*1000*1000 : 15*1000*1000, minNodeSize : 20 / window.devicePixelRatio , }, ultraHigh:{ maxLevelPercent: 1, pointBudget: 20*1000*1000, minNodeSize : 10 / window.devicePixelRatio, } //数值由testLevelSteps得来,其中nodeMaxLevel为2时,low和middle的都是1,如果真有这么低的点云就单独处理下。 //多个viewport尽量保证pointBudget一样,或者pointBudget不能太低于所需,否则会反复加载了又清除 }, clip:{ color: '#FFC266', //map }, measure:{ color:'#00C8AF', default:{ color:"#64C8BB",//"#00c7b2", opacity:0.7 }, highlight:{ color:'#00C8AF',//"#00c7b2", opacity:1, labelOpacity:0.7//1会挡住线和端点 }, guide:{ color:'#FFFFFF', opacity:0.8 } , backColor:'#333333', lineWidth: 3, textColor: "#000000", //"#FFFFFF" mulLabelHideFaraway : false ,// 多折线根据远近显示label adsorptMinDis : 30, //最小吸附距离(像素) }, material:{//初始化 pointSize: 0.1, realPointSize : 0.1,//实际上的ui滑动条默认大小(兼容旧的版本) minSize: 0.1, maxSize: 10000, pointSizeType: 'ATTENUATED', //'ADAPTIVE'//'ADAPTIVE' \ FIXED //ADAPTIVE的在小房间里大小会不太匹配,但在远景似乎更好 /* ATTENUATED : 衰减 真实大小,靠近时感觉是点云一点点变多,缝隙变小 ADAPTIVE: 自适应 大小根据level变化,越高越小。靠近时感觉点云由大慢慢细分成小份。这个感觉更佳但是navvis为何不用这个 */ absolutePanoramaSize: 1.3 ,//全景漫游时的size 是fixed的模式 //sizeAtPanoRtEDL : 2000, pointColor:'#ffffff', //sizeAddAtPanoRtEDL : 0.5, //全景模式静止时的size //ADAPTIVE : 字会失真扭曲 //'ATTENUATED' 往旁边看有缝隙、点在浮动 } , skyboxBgWidth : 100 , renderLayers:{//渲染层,方便分批渲染管理,替代scene的创建。数字不代表顺序。(数字不能太大) bg: 20, bg2: 21, skybox: 1, pointcloud: 11, sceneObjects:0,//default model : 2, light: 15, measure:4, magnifier:5, magnifierContent:16, volume:6, transformationTool:7, map:8, mapObjects:9,//default bothMapAndScene: 3, siteModeOnlyMapVisi:12,//只能mapViewer可见 siteModelMapUnvisi:13,//只有mapViewer不可见 siteModeSideVisi:14,//只有侧面可见 layer1: 18,// 备用1 layer2: 17,// 备用2 }, renderOrders:{ //会影响到绘制、pick时的顺序。 model:10, reticule:5, measureMarker: 6, measureLabelSub: 7, measureLabel: 8, sorptionSign:10, model:10, magnifier:50, }, siteModel:{ names:{ 'building': '建筑', 'floor':'楼层', 'room':'房间' }, floorHeightDefault: 5,//一层楼的高度 }, panosEdit:{ }, tiling: { panoPreRenderRepeatDelay: 2500, panoPreRenderDelay: 500, preRenderTourPanos: browser.valueFromHash("tileprerender", 0), tilingFlagNames: ["usetiles", "tiles"], maxNavPanoQuality: browser.valueFromHash("maxtileq", null), maxZoomPanoQuality: browser.valueFromHash("maxztileq", null), overlayStyle: browser.valueFromHash("tileoverlay", 0), uploadIntervalDelay: browser.valueFromHash("tileupdelay", 10 ), initialIntervalDelay: browser.valueFromHash("itiledelay", 0), maxNonBaseUploadsPerFrame: browser.valueFromHash("maxnbtpf", 1), maxBaseUploadsPerFrame: browser.valueFromHash("maxbtpf",6), customCompression: browser.valueFromHash("tilecustcomp", 0), mobileHighQualityOverride: !1, allowUltraHighResolution: !0 }, navigation: { panoScores: !1, mouseDirection: !0, filterStrictness: .75, angleFactor: -30, directionFactor: 10, distanceFactor: -1, optionalityFactor: 3 } , axis : { 'x':{color:'#ea3f3f'/* '#d0021b' */ /* 'red' */}, 'y':{ color:'#86c215' /* '#86c542' *//* 'green' */}, 'z': {color:'#3396f8'/* '#3399c8' */ /* 'blue' */}, 'xyz':{color:'#ccc',}}, shelterMargin:0.15, //多少米内不算遮挡 (有的场景深度图不准,和点云差别蛮大如SG-t-24F0iT3pKAO) highQualityMaxZoom: 2, ultraHighQualityMaxZoom: 3, panoFieldRadius : 10, //当前位置多远范围内可以切全景模式 clickMaxDragDis:3, clickMaxPressTime:200, //ms doubleClickTime:300,//双击间隔时间 testNodeCount1: browser.isMobile() ? 6 : 4, //testMaxNode次数达到这个数字时,changePointSize才使用nodeMaxLevel。 (调试时比较卡,在线上实际只需要3) background: '#232323', mapBG:/* '#232323', */ '#F5F5F5', //地图的clearColor pickFrontPointRatio:50, colors: { //from navvis red: [213,0,0], pink: [197,17,98], purple: [170,0,255], "deep purple": [98,0,234], blue: [ 41,98,255], "light blue": [ 0,145,234], cyan: [ 0,184,212], teal: [ 0,191,165], green: [0,200,83], "light green": [ 100,221,23], lime: [ 174,234,0], yellow: [ 255,214,0], amber: [ 255,171,0], orange: [ 255,109,0], "deep orange": [ 255,61,0], }, depthTexUVyLimit: 0.141, // 在这个范围内是没有深度的,从图片算的0.14003, 设置为稍大于这个数值 } config.OrthoCameraLimit = { standard:{ zoom:{min:0.0004, max:500}, //如果camera缩太小,地图会因为数字边界问题而扭曲 latPad:20, xBound:[-4e6, 4e6], }, expand:{ zoom:{min:0.0004, max:500}, //如果camera缩太小,地图会因为数字边界问题而扭曲 latPad:20, xBound:[-6e6, 6e6], }, } /* 显示模式: 1只显示点云: 滚轮为前进后退,方向键可以行走。进入漫游点时自动变为混合(这样全景可以弥补缝隙),过渡时只显示点云。 2只显示全景: 不能任意行走。 过渡时显示贴图材质非edl的点云(否则有折痕不贴合)。 3混合:都显示。 不能任意行走。过渡时显示贴图材质非edl的点云(因为只显示点云的话不太美,点云很碎,不细腻) */ window.testLevelSteps = function(steps){//[0.4,0.7,1] if(!steps){ let s = Potree.config.pointDensity; steps = [s.low.maxLevelPercent, s.middle.maxLevelPercent, s.high.maxLevelPercent, ] } let max = 1 while(++max<=12){ let r1 = steps.map(e=>e * max); let r2 = steps.map(e=>Math.round(e * max)); console.log(`当nodeMaxLevel为${max}时,每一级的level分别为${r2}, (小数:${r1})`) } console.log('请检查每一层的三个level是否有重复') } function getPrefix(){ let u = window.location.href.split('//') let v = u[1].split('/'); return v[0] } let isTest = browser.urlHasValue('test') let settings = {//设置 可修改 editType : '', number: '', //场景序号 originDatasetId:'',//场景原本的数据集id,应该就是数据集第一个吧 isOfficial:false, webSite:'testdata',//正式:'datav1', //不同环境对应的静态文件的地址不同 isLocal:false, //是否本地 局域网版本 libsUrl:'../libs/', displayMode:'', isTest , prefix: getPrefix(), pointDensity: '', UserPointDensity:'',//pointDensity会随着进入不同的模块而自动改变,UserPointDensity记录了用户的设置 UserDensityPercent:null,//点云密度百分比 ifShowMarker:true,//显示漫游点 floorplanType:{},//平面图类型 'default' | 'diy' 不同数据集不同{datasetId:...} floorplanEnable:false, floorplanEnables:{}, floorplanRequests:{},//开始加载了的 mapEnable:true,//地图区域是否加载地图 cameraFar : config.view.far, //相机最远范围 1-300 //limitFar: true, //是否使用setting的cameraFar来限制(如在点云裁剪时为false) showPanoMesh:false, //显示小球, dblToFocusPoint:false,//调试时如果需要双击飞向某个点云的点,就打开。此时不在漫游点的话单击将无法漫游。//因和单击漫游冲突 unableNavigate : false,//进入如裁剪界面时 禁止漫游 sizeFitToLevel: false,//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2 zoom:{ enabled : true, min:1, max: config.highQualityMaxZoom }, navConstantly:true, navTileClass: /* browser.isMobile() ? '1k' : */ '2k', //默认加载到 tileClass:'4k', //最高可达 /* loadTilesWhenUnfocus:false, //页面unfocus时也仍在加载tiles loadPointsWhenUnfocus:true, //页面unfocus时也仍在加载点云 */ //initialShowPano:true drawEntityData: false, //包括marker、线 zoomFromPointert:{//定点缩放(包括点云模式、全景模式、地图) whenPanos:true, whenPointCloud:true, map:true, }, rotAroundPoint:true,//点云模式是否能绕intersectPoint旋转 tourTestCameraMove:false, //测试镜头时,不移动真实的镜头, 只移动frustum cameraAniSmoothRatio : 20, //镜头动画平滑系数,越高越平滑 urls : $.extend({}, config.urls, { prefix : config.urls.prefix4 //主要使用的 是测试环境,根据不同工程更改 }), useDepthTex: true,//使用深度贴图,但不代表一定有(得到的intersect更快速准确和稳定) SS-t-7DUfWAUZ3V //matUseDepth:false, //panoEdit: datasetsPanos:{}, //mergeModel: boundAddObjs:false, intersectOnObjs:false, intersectWhenHover:true, depTexLocBindDataset: true,//是否在pano模式下,使用深度图得到intersect的话,改intersect能属于该pano所在的点云。也就相当于在全景模式下intersect的点属于该全景图 notAdditiveBlending:false, //点云是否使用普通的blend, 否则会曝光过渡 precision:2, // 两位小数 unit: 'm', useV4url:true, //v4的全景图等路径不一样 scene_view_data useRTskybox:true, //直接使用rtEDL绘制到屏幕,当是全景模式时. 在降4倍时能给render节省1毫秒,gpu时间未测 useRTPoint:true, //直接使用rtEDL绘制到屏幕,当是点云模式时。可以大大节省gpu时间。但有锯齿 pointEnableRT:false,//点云模式时是否绘制到rtEDL。如果不需要遮挡效果就不需绘制 cloudSameMat:true, //因为点云个数较多,就使用相同的材质,可见降低绘制速度(要保证所有点云的maxNodelevel一样,且要算出 material.spacing的平均值) showCompass : false, showAxis : isTest, //testCube : true, // moveToCenter:true, //针对数据集间隔很远的场景 dis>5000 容易抖动 tiles3DMaxMemory: config.tiles3DMaxMemory, adsorption:false,//测量时吸附点 pickFrontPointRatio:config.pickFrontPointRatio, //默认pick点云时选中靠近镜头的点的偏向 dragPolyBeyondPoint: browser.urlHasValue('dragPolyBeyondPoint'), //ctrlPolygon是否可以拖拽到没点云的地方 panoZoomByPointer: false,//全景图是否定点缩放 areaAtNotPlane: false, fastTran: isTest } Potree.config = config Potree.settings = settings settings.isLocalhost = settings.prefix.includes('localhost:') || settings.prefix.includes('localhost:') settings.isFormal = browser.urlHasValue('formal')//正式环境 本地测试 if(settings.isFormal){ settings.urls.prefix = settings.urls.prefix5 settings.webSite = 'datav1' } export {config, settings}