Parcourir la source

fix: labels仿卡顿

xzw il y a 2 ans
Parent
commit
4f66f0fcaa
3 fichiers modifiés avec 51 ajouts et 16 suppressions
  1. 16 9
      public/package/js/label.js
  2. 10 6
      public/package/js/objViewer.js
  3. 25 1
      public/package/js/utils.js

+ 16 - 9
public/package/js/label.js

@@ -33,10 +33,12 @@ class Label2D extends THREE.EventDispatcher {
 
         {
             let update = (e) => {
-                this.update()
+                this.update(e)
             }
-            viewer.addEventListener("view.changed", update) //确保player存在
-            this.addEventListener('dispose', (e) => { })
+            viewer.addEventListener("view.changed", update)  
+            this.addEventListener('dispose', (e) => { 
+                viewer.removeEventListener("view.changed", update) 
+            })
         }
         this.visible = true
         this.shelterByModel = o.shelterByModel
@@ -47,7 +49,7 @@ class Label2D extends THREE.EventDispatcher {
 
 
 
-    update() {
+    update(e={}) {
         if (!this.position || !this.visible) return
 
         var p = convertTool.getPos2d(this.position, viewer.camera, $("#player")[0]);
@@ -57,10 +59,14 @@ class Label2D extends THREE.EventDispatcher {
 
         //判断label是否被模型遮挡,遮挡则消失(如果是漫游模式最好提前计算visiblePanos)
 
-        if (this.shelterByModel && convertTool.ifShelter(this.position, p.vector, viewer.camera, viewer.model.children, 0.05)) {
-            this.elem.css('display', 'none'); return;
+        if (e.changeSlightly){
+            if (this.shelterByModel && convertTool.ifShelter(this.position, p.vector, viewer.camera, viewer.model.children, 0.05)) {
+                this.elem.css('display', 'none'); return;
+            }
+        }else{
+            //console.log('not changeSlightly')
         }
-
+         
 
         this.elem.css({
             left: p.pos.x + 'px',
@@ -100,9 +106,10 @@ class Label2D extends THREE.EventDispatcher {
     }
 
     dispose() {
-        this.elem.remove();
-        this._listeners = {}
+        this.elem.remove(); 
         this.dispatchEvent({ type: 'dispose' })
+        this._listeners = {}
+        console.log('dispose')
     }
 
 

+ 10 - 6
public/package/js/objViewer.js

@@ -106,7 +106,7 @@ Viewer.prototype.hasChanged = function () {//判断画面是否改变了,改
 
     if (!this.previousState) {
         copy()
-        return { cameraChanged: !0, changed: !0 };
+        return { cameraChanged: !0, changeSlightly: !1 };
     }
     var cameraChanged =
         !this.camera.projectionMatrix.equals(this.previousState.projectionMatrix) ||
@@ -114,11 +114,15 @@ Viewer.prototype.hasChanged = function () {//判断画面是否改变了,改
         !this.camera.quaternion.equals(this.previousState.quaternion)
 
 
-    var changed = cameraChanged //|| !this.mouse.equals(this.previousState.mouse)  
-
+    //var changed = cameraChanged //|| !this.mouse.equals(this.previousState.mouse)  
+    let changeSlightly
+    if(cameraChanged){
+        changeSlightly = math.closeTo(this.camera.position,this.previousState.position, 1e-3) &&
+            math.closeTo(this.camera.quaternion,this.previousState.quaternion, 1e-4) 
+    }
     copy()
 
-    return { cameraChanged, changed };
+    return { cameraChanged, changeSlightly };
 }
 
 Viewer.prototype.setSize = function () {
@@ -163,7 +167,7 @@ Viewer.prototype.animate = function () {
 
     let changed = this.hasChanged()
     if (changed.cameraChanged) {
-        this.dispatchEvent({ type: 'view.changed' })
+        this.dispatchEvent({ type: 'view.changed', changeSlightly:changed.changeSlightly })
 
         let label_ = this.labels.filter(e => e.elem[0].style.display == 'block')
         label_.sort((a, b) => b.pos2d.z - a.pos2d.z)
@@ -398,7 +402,7 @@ Viewer.prototype.removeLabel = function (label) {
     label.dispose()
     let index = this.labels.indexOf(label)
     index > -1 && this.labels.splice(index)
-    label.li.remove()
+    label.li && label.li.remove()
 }
 
 

+ 25 - 1
public/package/js/utils.js

@@ -500,4 +500,28 @@ let convertTool = {
 
 
 
-}
+}
+
+
+
+let math = {
+    closeTo : function(a,b, precision=1e-6){ 
+        let f = (a,b)=>{
+            return Math.abs(a-b) < precision;
+        }; 
+          
+        if(typeof (a) == 'number'){
+            return f(a, b);
+        }else {
+            let judge = (name)=>{
+                if(a[name] == void 0)return true //有值就判断,没值就不判断
+                else return f(a[name],b[name])
+            };
+            return judge('x') && judge('y') && judge('z') && judge('w')  
+        } 
+        
+    }, 
+
+
+}
+