|
@@ -254,7 +254,8 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
|
|
|
|
|
viewer.addEventListener('allLoaded',()=>{
|
|
viewer.addEventListener('allLoaded',()=>{
|
|
|
- let interval = setInterval(()=>{
|
|
|
|
|
|
|
+ let interval = setInterval(()=>{
|
|
|
|
|
+ if(!viewer.scene.pointclouds[0])return
|
|
|
let attrs = viewer.scene.pointclouds[0].root.geometryNode?.geometry.attributes || viewer.scene.pointclouds[0].root.geometry?.attributes
|
|
let attrs = viewer.scene.pointclouds[0].root.geometryNode?.geometry.attributes || viewer.scene.pointclouds[0].root.geometry?.attributes
|
|
|
if(!attrs) return
|
|
if(!attrs) return
|
|
|
if(attrs.ir){
|
|
if(attrs.ir){
|
|
@@ -310,6 +311,7 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
this.domRoot.appendChild(elDisplayModel[0]);
|
|
this.domRoot.appendChild(elDisplayModel[0]);
|
|
|
elDisplayModel.on("click", (e) => {
|
|
elDisplayModel.on("click", (e) => {
|
|
|
if(Potree.settings.displayMode == 'showPointCloud' && this.panos.length == 0)return
|
|
if(Potree.settings.displayMode == 'showPointCloud' && this.panos.length == 0)return
|
|
|
|
|
+ elDisplayModel.text( Potree.settings.displayMode == 'showPointCloud' ? '点云' : '全景')
|
|
|
Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
|
|
Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -1781,7 +1783,7 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
} );
|
|
} );
|
|
|
} else {
|
|
} else {
|
|
|
//如果离数据集较远,转动也很难找到点云,就飞到就近点:
|
|
//如果离数据集较远,转动也很难找到点云,就飞到就近点:
|
|
|
- if(Potree.settings.displayMode == 'showPointcloud'){
|
|
|
|
|
|
|
+ if(Potree.settings.displayMode == 'showPointCloud'){
|
|
|
let po = viewer.scene.pointclouds.find(e=>e.visibleNodes.some(a=>a.getLevel() > Math.ceil(e.maxLevel * 0.15) )) //虽然当点云在前方很远的地方也可能符合
|
|
let po = viewer.scene.pointclouds.find(e=>e.visibleNodes.some(a=>a.getLevel() > Math.ceil(e.maxLevel * 0.15) )) //虽然当点云在前方很远的地方也可能符合
|
|
|
|
|
|
|
|
if(!po){//无可见点云
|
|
if(!po){//无可见点云
|
|
@@ -2017,7 +2019,7 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
updateTileDownloader(t, vectorForward) {
|
|
updateTileDownloader(t, vectorForward) {
|
|
|
var i = this.nextPano || this.currentPano;
|
|
var i = this.nextPano || this.currentPano;
|
|
|
if(i){
|
|
if(i){
|
|
|
- this.tileDownloader.tilePrioritizer.updateCriteria(i, viewer.scene.view.position.clone() , vectorForward, t.length > 0 ? t : null),
|
|
|
|
|
|
|
+ this.tileDownloader.tilePrioritizer?.updateCriteria(i, viewer.scene.view.position.clone() , vectorForward, t.length > 0 ? t : null),
|
|
|
this.tileDownloader.processPriorityQueue = !0
|
|
this.tileDownloader.processPriorityQueue = !0
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2383,7 +2385,7 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
addHighMapCube(){//创建8*8的tile cube 主要因手机版崩溃 要在电脑端测试得设置maxRenderTargetSize
|
|
addHighMapCube(){//创建8*8的tile cube 主要因手机版崩溃 要在电脑端测试得设置maxRenderTargetSize
|
|
|
|
|
|
|
|
- if( this.qualityManager.maxRenderTargetSize < Potree.settings.tileClass){
|
|
|
|
|
|
|
+ if( this.qualityManager.maxRenderTargetSize < Potree.settings.tileClass && !this.highMapCube){
|
|
|
|
|
|
|
|
var geo = new THREE.PlaneGeometry(1, 1, 1, 1)
|
|
var geo = new THREE.PlaneGeometry(1, 1, 1, 1)
|
|
|
var cube = new THREE.Object3D;
|
|
var cube = new THREE.Object3D;
|
|
@@ -2529,31 +2531,54 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
/* let hcos = Math.cos(hfov / 2)
|
|
/* let hcos = Math.cos(hfov / 2)
|
|
|
let vcos = Math.cos(vfov / 2) */
|
|
let vcos = Math.cos(vfov / 2) */
|
|
|
let list = this.highMapCube.tiles
|
|
let list = this.highMapCube.tiles
|
|
|
|
|
+ let frustumMatrix = new THREE.Matrix4
|
|
|
|
|
+ frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)
|
|
|
|
|
+ let frustum = new THREE.Frustum();
|
|
|
|
|
+ frustum.setFromProjectionMatrix(frustumMatrix)
|
|
|
|
|
+ let p_ = new THREE.Vector3
|
|
|
|
|
+
|
|
|
|
|
+ //屏幕外的不显示
|
|
|
list.forEach(e => {
|
|
list.forEach(e => {
|
|
|
- //屏幕外的不显示
|
|
|
|
|
- let pos = e.getWorldPosition(new THREE.Vector3())
|
|
|
|
|
|
|
+ /* let pos = e.getWorldPosition(new THREE.Vector3())
|
|
|
let dir = new THREE.Vector3().subVectors(pos, this.highMapCube.position).normalize()
|
|
let dir = new THREE.Vector3().subVectors(pos, this.highMapCube.position).normalize()
|
|
|
-
|
|
|
|
|
|
|
+ //再看好像不对
|
|
|
let hcos_ = dir.clone().setZ(direction.z).normalize().dot(direction) //在direction的斜面上水平角度差
|
|
let hcos_ = dir.clone().setZ(direction.z).normalize().dot(direction) //在direction的斜面上水平角度差
|
|
|
let hRad = Math.acos(hcos_)
|
|
let hRad = Math.acos(hcos_)
|
|
|
let vRad = -200
|
|
let vRad = -200
|
|
|
- if (/* hRad > hfov + 0.08 */ hRad / hfov > 1.5 ) {
|
|
|
|
|
|
|
+ if ( hRad / hfov > 1.5 ) {
|
|
|
e.score = -100
|
|
e.score = -100
|
|
|
} else {
|
|
} else {
|
|
|
vRad = Math.abs(Math.acos(dir.z) - Math.acos(direction.z))
|
|
vRad = Math.abs(Math.acos(dir.z) - Math.acos(direction.z))
|
|
|
- if (/* vRad > vfov + 0.08 */ vRad / vfov > 1.5 ) {
|
|
|
|
|
|
|
+ if ( vRad / vfov > 1.5 ) {
|
|
|
e.score = -100
|
|
e.score = -100
|
|
|
} else {
|
|
} else {
|
|
|
e.score = -(hRad / hfov + vRad / vfov)
|
|
e.score = -(hRad / hfov + vRad / vfov)
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- e.scores = hRad.toFixed(3) + ', ' + vRad.toFixed(3)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ } */
|
|
|
|
|
+ let a = frustum.intersectsObject(e)//外包围球粗略判断
|
|
|
|
|
+ if(a){//显示所有在屏幕上有显示的tile
|
|
|
|
|
+ e.score = 1
|
|
|
|
|
+ /* for(let i=0;i<4;i++){//精确计算,检测是否四个顶点都在屏幕内(虽然减少不了多少个 )
|
|
|
|
|
+ p_.copy(e.geometry.vertices[i]).applyMatrix4(e.matrixWorld)
|
|
|
|
|
+
|
|
|
|
|
+ if(history_.find(o=>math.closeTo(o,p_)) || frustum.containsPoint(p_) ){
|
|
|
|
|
+ e.score = 2
|
|
|
|
|
+ history_.push( p_.clone() )
|
|
|
|
|
+ break
|
|
|
|
|
+ }//
|
|
|
|
|
+ 若tile底部横跨屏幕,且中心点不在屏幕,将检测不到,所以不算了
|
|
|
|
|
+ */
|
|
|
|
|
+ }else e.score = -100
|
|
|
|
|
+ //e.score = frustum.intersectsObject(e) ? 1 : -100
|
|
|
|
|
+ //e.scores = hRad.toFixed(3) + ', ' + vRad.toFixed(3)
|
|
|
if (e.score == -100) {
|
|
if (e.score == -100) {
|
|
|
this.resetTile(e)
|
|
this.resetTile(e)
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
this.highMapCube.visibleTiles = list.filter(e => e.score > -100)
|
|
this.highMapCube.visibleTiles = list.filter(e => e.score > -100)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //console.log('cost', performance.now() - time, 'same',same)
|
|
|
//list.forEach(e=>e.scoreLabel.setText(e.scores))
|
|
//list.forEach(e=>e.scoreLabel.setText(e.scores))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2653,6 +2678,7 @@ export class Images360 extends THREE.EventDispatcher{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ //融合页面加了个canUseMapCube,但这边tileClass必不小于4096所以不改了
|
|
|
|
|
|
|
|
|
|
|
|
|
resetHighMap() {
|
|
resetHighMap() {
|