|
@@ -5315,11 +5315,13 @@
|
|
|
info.onUpdate && info.onUpdate(progress, delta);
|
|
|
}), info.duration, posDone, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine, null, this.FlyTransition, () => {
|
|
|
//中途取消
|
|
|
- if (endTarget) {
|
|
|
+ if (rotWaitDone) {
|
|
|
/* endPosition = new THREE.Vector3().copy(this.position)//更改旋转的endQuaternion
|
|
|
endQuaternion = math.getQuaFromPosAim(endPosition,endTarget) */
|
|
|
//直接改变endQuaternion会突变,所以还是cancel吧
|
|
|
this.cancelFlying('rotate');
|
|
|
+ } else {
|
|
|
+ this.dispatchEvent('flyCancel');
|
|
|
}
|
|
|
posWaitDone = false;
|
|
|
info.cancelFun && info.cancelFun();
|
|
@@ -5343,8 +5345,14 @@
|
|
|
//中途取消
|
|
|
rotWaitDone = false;
|
|
|
info.cancelFun && info.cancelFun();
|
|
|
+ this.dispatchEvent('flyCancel');
|
|
|
}, info.ignoreFirstFrame);
|
|
|
}
|
|
|
+ if (!posWaitDone && !rotWaitDone) {
|
|
|
+ //已经到达目标
|
|
|
+ info.onUpdate && info.onUpdate(1);
|
|
|
+ done();
|
|
|
+ }
|
|
|
|
|
|
/* transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
|
|
|
let t = progress
|
|
@@ -21184,9 +21192,7 @@
|
|
|
if (!Potree.settings.UserPointDensity) {
|
|
|
Potree.settings.UserPointDensity = 'high'; //'middle'
|
|
|
}
|
|
|
- Potree.Log('loadPointCloudDone 点云加载完毕', {
|
|
|
- font: [null, 10]
|
|
|
- });
|
|
|
+ Potree.Log('loadPointCloudDone 点云加载完毕');
|
|
|
}
|
|
|
{
|
|
|
//初始位置
|
|
@@ -21425,7 +21431,10 @@
|
|
|
|
|
|
pointcloud.updateMatrixWorld();
|
|
|
Potree.Log("\u70B9\u4E91".concat(pointcloud.dataset_id, "(").concat(pointcloud.name, ")\u65CB\u8F6C\u503C:").concat(pointcloud.orientationUser, ", \u4F4D\u7F6E").concat(math.toPrecision(pointcloud.translateUser.toArray(), 3), ", \u7ECF\u7EAC\u5EA6 ").concat(dataset.location, ", spacing ").concat(pointcloud.material.spacing), {
|
|
|
- font: [null, 13]
|
|
|
+ font: {
|
|
|
+ color: "#5af",
|
|
|
+ fontSize: 13
|
|
|
+ }
|
|
|
});
|
|
|
};
|
|
|
if (!Potree.settings.originDatasetId) Potree.settings.originDatasetId = data[0].id;
|
|
@@ -21440,65 +21449,64 @@
|
|
|
{
|
|
|
//拿初始数据集作为基准。它的位置要放到000
|
|
|
var locationLonLat = originDataset.location.slice(0, 2);
|
|
|
- if (window.AMapWith84) {
|
|
|
- //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差. navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
|
|
|
- locationLonLat = AMapWith84.wgs84ToAMap({
|
|
|
- x: locationLonLat[0],
|
|
|
- y: locationLonLat[1]
|
|
|
- });
|
|
|
- locationLonLat = [locationLonLat.x, locationLonLat.y];
|
|
|
- }
|
|
|
+ Potree.setLonlat(locationLonLat[0], locationLonLat[1]);
|
|
|
+ /* if(window.AMapWith84){//需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差. navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
|
|
|
+ locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
|
|
|
+ locationLonLat = [locationLonLat.x,locationLonLat.y]
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
|
|
|
proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
|
|
|
proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
|
|
|
- var transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影 LOCAL即NAVVIS:TMERC
|
|
|
- var transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs;");
|
|
|
+
|
|
|
+ let transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影 LOCAL即NAVVIS:TMERC
|
|
|
+ let transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs;");
|
|
|
//注:转入后再转出,和原来的有偏差。如果输入是local坐标,数字越大偏差越大,当百万时就明显了。如果是lonlat,很奇怪经度小于50时就乱了。
|
|
|
viewer.transform = {
|
|
|
- lonlatToLocal: transform1,
|
|
|
- lonlatTo4550: transform2 // 转大地坐标EPSG:4550
|
|
|
- };
|
|
|
- if (window.AMapWith84 && Potree.settings.mapCompany != 'google') {
|
|
|
- //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
|
|
|
- var change = transform => {
|
|
|
- var forward = transform.forward;
|
|
|
- var inverse = transform.inverse;
|
|
|
- transform.forward = function (e, not84) {
|
|
|
- var needTran = e.x == void 0;
|
|
|
- if (needTran) var a1 = {
|
|
|
- x: e[0],
|
|
|
- y: e[1]
|
|
|
- };else var a1 = e;
|
|
|
- var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
|
|
|
- if (needTran) {
|
|
|
- a = [a.x, a.y];
|
|
|
- e[2] != void 0 && (a[2] = e[2]);
|
|
|
- } else {
|
|
|
- e.z != void 0 && (a.z = e.z);
|
|
|
- }
|
|
|
- return forward(a);
|
|
|
- };
|
|
|
- transform.inverse = function (e, not84) {
|
|
|
- var needTran = e.x == void 0;
|
|
|
- var a = inverse(e);
|
|
|
- needTran && (a = {
|
|
|
- x: a[0],
|
|
|
- y: a[1]
|
|
|
- });
|
|
|
- a = not84 ? a : AMapWith84.aMapToWgs84(a);
|
|
|
- if (needTran) {
|
|
|
- a = [a.x, a.y];
|
|
|
- e[2] != void 0 && (a[2] = e[2]);
|
|
|
- } else {
|
|
|
- e.z != void 0 && (a.z = e.z);
|
|
|
- }
|
|
|
- return a;
|
|
|
- };
|
|
|
- };
|
|
|
- for (var f in viewer.transform) {
|
|
|
- change(viewer.transform[f]);
|
|
|
- }
|
|
|
- }
|
|
|
+ lonlatToLocal : transform1,
|
|
|
+ lonlatTo4550 : transform2 // 转大地坐标EPSG:4550
|
|
|
+ }
|
|
|
+
|
|
|
+ if(window.AMapWith84 && Potree.settings.mapCompany != 'google'){//需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
|
|
|
+ let change = (transform)=>{
|
|
|
+ let forward = transform.forward
|
|
|
+ let inverse = transform.inverse;
|
|
|
+
|
|
|
+ transform.forward = function(e, not84){
|
|
|
+ let needTran = e.x == void 0
|
|
|
+ if(needTran)var a1 = {x:e[0],y:e[1]}
|
|
|
+ else var a1 = e
|
|
|
+ var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1)
|
|
|
+ if(needTran){
|
|
|
+ a = [a.x, a.y]; e[2] != void 0 && (a[2] = e[2])
|
|
|
+ }else{
|
|
|
+ e.z != void 0 && (a.z = e.z)
|
|
|
+ }
|
|
|
+ return forward(a)
|
|
|
+ }
|
|
|
+
|
|
|
+ transform.inverse = function(e, not84){
|
|
|
+ let needTran = e.x == void 0
|
|
|
+ var a = inverse(e)
|
|
|
+ needTran && (a = {x:a[0],y:a[1]})
|
|
|
+ a = not84 ? a : AMapWith84.aMapToWgs84(a)
|
|
|
+
|
|
|
+ if(needTran){
|
|
|
+ a = [a.x,a.y]; e[2] != void 0 && (a[2] = e[2])
|
|
|
+ }else{
|
|
|
+ e.z != void 0 && (a.z = e.z)
|
|
|
+ }
|
|
|
+ return a
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ for(let f in viewer.transform){
|
|
|
+ change(viewer.transform[f])
|
|
|
+ }
|
|
|
+ } */
|
|
|
+
|
|
|
viewer.mapViewer && viewer.mapViewer.mapLayer.maps[0].updateProjection();
|
|
|
}
|
|
|
data.forEach((dataset, index) => {
|
|
@@ -21554,7 +21562,9 @@
|
|
|
var pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id);
|
|
|
if (!pointcloud) {
|
|
|
Potree.Log('数据集id变了,自动使用第一个', {
|
|
|
- font: ['#500']
|
|
|
+ font: {
|
|
|
+ color: '#500'
|
|
|
+ }
|
|
|
});
|
|
|
pointcloud = viewer.scene.pointclouds[0];
|
|
|
}
|
|
@@ -21674,9 +21684,7 @@
|
|
|
boundSize,
|
|
|
center
|
|
|
} = viewer.bound;
|
|
|
- Potree.Log("\u4E2D\u5FC3\u70B9: ".concat(math.toPrecision(center.toArray(), 2), ", boundSize: ").concat(math.toPrecision(boundSize.toArray(), 2), " "), {
|
|
|
- font: [null, 12]
|
|
|
- });
|
|
|
+ Potree.Log("\u4E2D\u5FC3\u70B9: ".concat(math.toPrecision(center.toArray(), 2), ", boundSize: ").concat(math.toPrecision(boundSize.toArray(), 2), " "));
|
|
|
viewer.scene.view.setView({
|
|
|
position: center.clone().add(new Vector3(10, 5, 10)),
|
|
|
target: center
|
|
@@ -21828,9 +21836,7 @@
|
|
|
if (!Potree.settings.UserPointDensity) {
|
|
|
Potree.settings.UserPointDensity = 'high'; //'middle'
|
|
|
}
|
|
|
- Potree.Log('loadPointCloudDone 点云加载完毕', {
|
|
|
- font: [null, 10]
|
|
|
- });
|
|
|
+ Potree.Log('loadPointCloudDone 点云加载完毕');
|
|
|
}
|
|
|
viewer.dispatchEvent('allLoaded');
|
|
|
done(pointcloud);
|
|
@@ -25531,9 +25537,10 @@
|
|
|
}; //拓宽的lineWidth
|
|
|
|
|
|
//raycaster.layers.enableAll()//add
|
|
|
- Potree.Utils.setCameraLayers(raycaster,
|
|
|
- //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
|
|
|
- ['sceneObjects', 'mapObjects', 'measure', 'transformationTool', 'model', 'bothMapAndScene'], this.hoverViewport && this.hoverViewport.extraEnableLayers);
|
|
|
+ var layers = ['sceneObjects', 'mapObjects', 'measure', 'transformationTool', 'model', 'bothMapAndScene']; //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
|
|
|
+ if (Potree.settings.mergeType2 && Potree.settings.modelSkybox && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.hasDepthTex) layers.push('skybox'); //model变成skybox了
|
|
|
+ Potree.Utils.setCameraLayers(raycaster, layers, this.hoverViewport && this.hoverViewport.extraEnableLayers);
|
|
|
+
|
|
|
//this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
|
|
|
|
|
|
viewer.dispatchEvent({
|
|
@@ -26981,7 +26988,7 @@
|
|
|
markerTex.ring.anisotropy = 4;
|
|
|
//有可能被点云遮住吗。
|
|
|
}
|
|
|
- return new DepthBasicMaterial({
|
|
|
+ var mat = new DepthBasicMaterial({
|
|
|
opacity: markerOpacitys.default,
|
|
|
side: DoubleSide,
|
|
|
map: markerTex.default,
|
|
@@ -26989,10 +26996,12 @@
|
|
|
clipDistance: 2,
|
|
|
occlusionDistance: 1,
|
|
|
//不能设置太短,因为过渡时深度不准确
|
|
|
- useDepth: !!(Potree.settings.useDepthTex && this.pointcloud.hasDepthTex),
|
|
|
+ useDepth: !!(Potree.settings.useDepthTex && this.pointcloud.hasDepthTex || Potree.settings.modelSkybox && this.pointcloud.is4dkkModel),
|
|
|
autoDepthTest: true
|
|
|
//改为DepthBasicMaterial是因为原Basic的材质在有深度图时过渡会先隐藏后出现。 注:没有深度图时全景模式的marker无法遮挡
|
|
|
});
|
|
|
+ mat.mapTransparent = true;
|
|
|
+ return mat;
|
|
|
}
|
|
|
hoverOn() {
|
|
|
var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
@@ -30291,7 +30300,7 @@
|
|
|
this.cube.layers.set(Potree.config.renderLayers.skybox);
|
|
|
this.cube.name = 'skyboxCube';
|
|
|
viewer.scene.scene.add(this.cube);
|
|
|
- if (Potree.settings.mergeType2) {
|
|
|
+ if (Potree.settings.mergeType2 && Potree.settings.modelSkybox) {
|
|
|
this.materialInside = new ModelTextureMaterial();
|
|
|
this.materialInside.dontChangeDepth = true; //chunk本身深度是对的,不用深度图,否则过渡会有很多裂痕
|
|
|
this.cube.material.defines.depth_background = ''; //skybox的深度改得向后一些, 避免盖住chunk,造成坑坑洼洼
|
|
@@ -30515,8 +30524,10 @@
|
|
|
Potree.settings.displayMode = mode;
|
|
|
}
|
|
|
viewer.mainViewport.view.removeEventListener('flyingDone', f);
|
|
|
+ viewer.mainViewport.view.removeEventListener('flyCancel', f);
|
|
|
};
|
|
|
viewer.mainViewport.view.addEventListener('flyingDone', f); //once
|
|
|
+ viewer.mainViewport.view.addEventListener('flyCancel', f);
|
|
|
return;
|
|
|
}
|
|
|
if (this.isAtPano() && !this.latestToPano) {
|
|
@@ -30533,7 +30544,7 @@
|
|
|
this.removeEventListener('flyToPanoDone', wait);
|
|
|
setTimeout(() => {
|
|
|
if (this.latestRequestMode == mode) {
|
|
|
- Potree.settings.displayMode = mode;
|
|
|
+ Potree.settings.displayMode = mode; //被打断,重新执行
|
|
|
}
|
|
|
}, e.makeIt ? 1 : 50);
|
|
|
};
|
|
@@ -30730,14 +30741,14 @@
|
|
|
});
|
|
|
}
|
|
|
judgeModelMat(object) {
|
|
|
- if (!Potree.settings.mergeType2) return;
|
|
|
+ if (!(Potree.settings.mergeType2 && Potree.settings.modelSkybox)) return;
|
|
|
object.traverse(mesh => {
|
|
|
if (mesh.material) {
|
|
|
if (!mesh.materialOutside) {
|
|
|
mesh.materialOutside = mesh.material;
|
|
|
}
|
|
|
mesh.material = Potree.settings.displayMode == 'showPanos' ? this.materialInside : mesh.materialOutside;
|
|
|
- Potree.Utils.setObjectLayers(mesh, Potree.settings.displayMode == 'showPanos' ? 'skybox' : 'model');
|
|
|
+ Potree.Utils.setObjectLayers(mesh, Potree.settings.displayMode == 'showPanos' ? 'skybox' : 'model'); //为了渲染到rtEDL
|
|
|
}
|
|
|
});
|
|
|
}
|
|
@@ -30849,7 +30860,7 @@
|
|
|
if (!toPano.pano.enabled) return done(false, true);
|
|
|
//Potree.Log('hope flyToPano: '+toPano.pano.id, toPano.pano.position.toArray() )
|
|
|
|
|
|
- if (this.latestToPano && this.latestToPano != toPano && (
|
|
|
+ if (!toPano.canCancelLast && this.latestToPano && this.latestToPano != toPano && (
|
|
|
//还在飞
|
|
|
this.latestToPano.pano != this.currentPano || !this.isAtPano())) {
|
|
|
//如果旧的toPano只在pano旋转镜头,就直接取消旧的,继续执行
|
|
@@ -35268,6 +35279,7 @@
|
|
|
}
|
|
|
setRenderCloud() {
|
|
|
var _this = this;
|
|
|
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
//使利用viewer的渲染来渲染点云 (如果点云不旋转其实也可以贴floorplan……)
|
|
|
this.renderPointcloud = true;
|
|
|
this.viewports[0].noPointcloud = false;
|
|
@@ -35283,6 +35295,9 @@
|
|
|
//注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
|
|
|
return;
|
|
|
}
|
|
|
+ if (!options.renderMeasure) {
|
|
|
+ viewer.scene.measurements.forEach(e => Potree.Utils.updateVisible(e, 'renderCloudAtMap', false));
|
|
|
+ }
|
|
|
viewer.renderDefault({
|
|
|
viewports: _this.viewports,
|
|
|
camera: _this.camera,
|
|
@@ -35291,6 +35306,7 @@
|
|
|
clear: oldMapClear,
|
|
|
pRenderer
|
|
|
});
|
|
|
+ viewer.scene.measurements.forEach(e => Potree.Utils.updateVisible(e, 'renderCloudAtMap', true));
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -41963,8 +41979,8 @@
|
|
|
var areaPlaneMats = {};
|
|
|
class Prism extends Measure$1 {
|
|
|
constructor(args) {
|
|
|
+ args.isPrism = true;
|
|
|
super(args);
|
|
|
- this.isPrism = true;
|
|
|
this.volumeInfo = {};
|
|
|
this.needsCompute = true;
|
|
|
/*this.createPrismLines(new THREE.Color('#FFF') )
|
|
@@ -64275,7 +64291,7 @@
|
|
|
if (!params.magnifier) {
|
|
|
if (Potree.settings.displayMode == 'showPanos' || Potree.settings.testCube) {
|
|
|
Potree.Utils.setCameraLayers(camera, ['skybox']);
|
|
|
- if (Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && rtEDL) {
|
|
|
+ if (Potree.settings.displayMode == 'showPanos' && (viewer.images360.currentPano.pointcloud.hasDepthTex || Potree.settings.modelSkybox && viewer.images360.currentPano.pointcloud.is4dkkModel) && rtEDL) {
|
|
|
//渲染深度图
|
|
|
|
|
|
renderer.setRenderTarget(rtEDL); //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
|
|
@@ -81551,10 +81567,10 @@
|
|
|
horizonZ = prism.horizonZ;
|
|
|
zMin = prism.zMin;
|
|
|
zMax = prism.zMax;
|
|
|
- bound = new Box3();
|
|
|
- for (var i = 0; i < prism.points.length; i++) {
|
|
|
- bound.expandByPoint(prism.points[i]);
|
|
|
- }
|
|
|
+ bound = new Box3().copy(prism.prismBound);
|
|
|
+ /* for(let i=0;i<prism.points.length;i++){
|
|
|
+ bound.expandByPoint(prism.points[i])
|
|
|
+ } */
|
|
|
} else {
|
|
|
zMin = this.computingObject.model.clipBound.min.z;
|
|
|
zMax = this.computingObject.model.clipBound.max.z;
|
|
@@ -81582,7 +81598,7 @@
|
|
|
|
|
|
bound.getCenter(center);
|
|
|
bound.getSize(boundSize);
|
|
|
- this.boundSizeZero = boundSize.x <= 0 || boundSize.y <= 0 || boundSize.z <= 0; //prism的问题
|
|
|
+ this.boundSizeZero = boundSize.x <= 0 || boundSize.y <= 0 || this.computingObject.model && boundSize.z <= 0; //prism的问题
|
|
|
if (this.boundSizeZero) {
|
|
|
computeDone({
|
|
|
highest: 0,
|
|
@@ -81660,11 +81676,11 @@
|
|
|
boundSize_.x /= cW, boundSize_.y /= cH;
|
|
|
|
|
|
//分批渲染:从左到右 从下到上
|
|
|
- var _loop = async function _loop(_i) {
|
|
|
+ var _loop = async function _loop(i) {
|
|
|
var _loop2 = async function _loop2(j) {
|
|
|
var infos = [];
|
|
|
- var progressStart = (_i * cH + j) / (cW * cH),
|
|
|
- progressEnd = (_i * cH + j + 1) / (cW * cH);
|
|
|
+ var progressStart = (i * cH + j) / (cW * cH),
|
|
|
+ progressEnd = (i * cH + j + 1) / (cW * cH);
|
|
|
if (interrupt) {
|
|
|
return {
|
|
|
v: {
|
|
@@ -81675,14 +81691,14 @@
|
|
|
Potree.settings.pointDensity = 'screenshot'; //恢复为nodeMaxLevel
|
|
|
//最高处朝下看,找挖方的顶部
|
|
|
_this.view.pitch = -Math.PI / 2;
|
|
|
- var endPosition = new Vector3(center.x + (_i - cW / 2 + 0.5) * boundSize_.x, center.y + (j - cH / 2 + 0.5) * boundSize_.y, center.z);
|
|
|
+ var endPosition = new Vector3(center.x + (i - cW / 2 + 0.5) * boundSize_.x, center.y + (j - cH / 2 + 0.5) * boundSize_.y, center.z);
|
|
|
_this.view.moveOrthoCamera(_this.viewport, {
|
|
|
boundSize: boundSize_,
|
|
|
endPosition
|
|
|
}, 0);
|
|
|
var endPercent = _this.computingObject.model ? 0.7 : 0.4;
|
|
|
await _this.render({
|
|
|
- i: _i,
|
|
|
+ i,
|
|
|
j,
|
|
|
index: 1,
|
|
|
cW,
|
|
@@ -81702,7 +81718,7 @@
|
|
|
//水平面朝下看,找填方
|
|
|
_this.view.position.z = horizonZ + _this.camera.near;
|
|
|
await _this.render({
|
|
|
- i: _i,
|
|
|
+ i,
|
|
|
j,
|
|
|
index: 2,
|
|
|
cW,
|
|
@@ -81720,7 +81736,7 @@
|
|
|
|
|
|
var result = {
|
|
|
index: {
|
|
|
- i: _i,
|
|
|
+ i,
|
|
|
j
|
|
|
},
|
|
|
allFills: [],
|
|
@@ -81816,7 +81832,7 @@
|
|
|
return; //出界
|
|
|
}
|
|
|
} else {
|
|
|
- if (_this.getModelZByRes(u, v, cW, cH, _i, j) == void 0) {
|
|
|
+ if (_this.getModelZByRes(u, v, cW, cH, i, j) == void 0) {
|
|
|
return; //出界
|
|
|
}
|
|
|
}
|
|
@@ -81924,8 +81940,8 @@
|
|
|
}
|
|
|
},
|
|
|
_ret;
|
|
|
- for (var _i = 0; _i < cW; _i++) {
|
|
|
- _ret = await _loop(_i);
|
|
|
+ for (var i = 0; i < cW; i++) {
|
|
|
+ _ret = await _loop(i);
|
|
|
if (_ret) return _ret.v;
|
|
|
}
|
|
|
var Vupper = 0,
|
|
@@ -89251,6 +89267,7 @@
|
|
|
viewer.addTimeMark('renderOverlay', 'end');
|
|
|
}
|
|
|
renderOverlay1(params) {
|
|
|
+ //渲染主要的mesh
|
|
|
var camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
|
var renderer = params.renderer || this.renderer;
|
|
|
this.reticule.updateAtViewports(params.viewport);
|
|
@@ -89272,8 +89289,9 @@
|
|
|
if ('renderBeforeCloud' in params) {
|
|
|
this.scene.scene.traverse(object => {
|
|
|
if (object.material) {
|
|
|
- Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud && (object.material.opacity < 1 || !object.material.depthTest) || !params.renderBeforeCloud && object.material.opacity == 1 && object.material.depthTest ? false : true);
|
|
|
- //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染
|
|
|
+ var transparent = object.material.opacity < 1 || object.material.mapTransparent || !object.material.depthTest;
|
|
|
+ Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud != transparent);
|
|
|
+ //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
|
|
|
}
|
|
|
}); //ground的材质中opacity为1,所以被当做不透明了
|
|
|
}
|
|
@@ -89297,6 +89315,7 @@
|
|
|
});
|
|
|
}
|
|
|
renderOverlay2(params) {
|
|
|
+ //渲染剩余部分
|
|
|
var renderer = params.renderer || this.renderer;
|
|
|
var camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
|
//清除深度 !!!!
|
|
@@ -92450,10 +92469,13 @@
|
|
|
model.is4dkkModel = true;
|
|
|
model.panos = [];
|
|
|
//模拟点云,需要rotX(90)+平移一段才能和四维看看的bound一样
|
|
|
- var rot1M = new THREE.Matrix4().makeRotationX(Math.PI / 2);
|
|
|
+ var rot1M = new THREE.Matrix4();
|
|
|
var pos1 = new THREE.Vector3();
|
|
|
- pos1.fromArray(model.runtime.getTileset().tileset.root.boundingVolume.box.slice(0, 3)); //必须要平移一段才能重合
|
|
|
- pos1.copy(Potree.math.convertVector.ZupToYup(pos1));
|
|
|
+ if (model.fileType == '3dTiles') {
|
|
|
+ pos1.fromArray(model.runtime.getTileset().tileset.root.boundingVolume.box.slice(0, 3)); //必须要平移一段才能重合
|
|
|
+ pos1.copy(Potree.math.convertVector.ZupToYup(pos1));
|
|
|
+ rot1M.makeRotationX(Math.PI / 2);
|
|
|
+ }
|
|
|
var pos1M = new THREE.Matrix4().setPosition(pos1);
|
|
|
model.posRot1MatrixInvert = new THREE.Matrix4().multiplyMatrices(pos1M, rot1M).invert();
|
|
|
model.rot1MatrixInvert = rot1M.clone().invert();
|
|
@@ -92514,6 +92536,68 @@
|
|
|
fetchMethod: 'post'
|
|
|
}, callback, callback);
|
|
|
}
|
|
|
+ function setLonlat(lon, lat) {
|
|
|
+ var locationLonLat = [lon, lat];
|
|
|
+ if (window.AMapWith84) {
|
|
|
+ //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差. navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
|
|
|
+ locationLonLat = AMapWith84.wgs84ToAMap({
|
|
|
+ x: lon,
|
|
|
+ y: lat
|
|
|
+ });
|
|
|
+ locationLonLat = [locationLonLat.x, locationLonLat.y];
|
|
|
+ }
|
|
|
+ proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
|
|
|
+ proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
|
|
|
+ proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
|
|
|
+ var transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影 LOCAL即NAVVIS:TMERC
|
|
|
+ var transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs;");
|
|
|
+ //注:转入后再转出,和原来的有偏差。如果输入是local坐标,数字越大偏差越大,当百万时就明显了。如果是lonlat,很奇怪经度小于50时就乱了。
|
|
|
+ viewer.transform = {
|
|
|
+ lonlatToLocal: transform1,
|
|
|
+ lonlatTo4550: transform2 // 转大地坐标EPSG:4550
|
|
|
+ };
|
|
|
+ if (window.AMapWith84 && Potree.settings.mapCompany != 'google') {
|
|
|
+ //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
|
|
|
+ var change = transform => {
|
|
|
+ var forward = transform.forward;
|
|
|
+ var inverse = transform.inverse;
|
|
|
+ transform.forward = function (e, not84) {
|
|
|
+ var needTran = e.x == void 0;
|
|
|
+ if (needTran) var a1 = {
|
|
|
+ x: e[0],
|
|
|
+ y: e[1]
|
|
|
+ };else var a1 = e;
|
|
|
+ var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
|
|
|
+ if (needTran) {
|
|
|
+ a = [a.x, a.y];
|
|
|
+ e[2] != void 0 && (a[2] = e[2]);
|
|
|
+ } else {
|
|
|
+ e.z != void 0 && (a.z = e.z);
|
|
|
+ }
|
|
|
+ return forward(a);
|
|
|
+ };
|
|
|
+ transform.inverse = function (e, not84) {
|
|
|
+ var needTran = e.x == void 0;
|
|
|
+ var a = inverse(e);
|
|
|
+ needTran && (a = {
|
|
|
+ x: a[0],
|
|
|
+ y: a[1]
|
|
|
+ });
|
|
|
+ a = not84 ? a : AMapWith84.aMapToWgs84(a);
|
|
|
+ if (needTran) {
|
|
|
+ a = [a.x, a.y];
|
|
|
+ e[2] != void 0 && (a[2] = e[2]);
|
|
|
+ } else {
|
|
|
+ e.z != void 0 && (a.z = e.z);
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ };
|
|
|
+ };
|
|
|
+ for (var f in viewer.transform) {
|
|
|
+ change(viewer.transform[f]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
//site_model
|
|
|
/* {
|
|
@@ -92835,6 +92919,7 @@
|
|
|
exports.pointBudget = pointBudget;
|
|
|
exports.resourcePath = resourcePath;
|
|
|
exports.saveProject = saveProject;
|
|
|
+ exports.setLonlat = setLonlat;
|
|
|
exports.settings = settings;
|
|
|
exports.start = start;
|
|
|
exports.version = version;
|