Prechádzať zdrojové kódy

地磁校准时加入剔除多余点的算法

lvjincheng 3 rokov pred
rodič
commit
69d22dfdb9

+ 7 - 1
Assets/BowArrow/Scripts/Bluetooth/AimHandler.cs

@@ -140,6 +140,7 @@ public class AimHandler : MonoBehaviour
         try {
             if (calibration)
             {
+                PointCorrector.ins = new PointCorrector(this.ellipseScript, this.MagCalibrater);
                 MagCalibrater.Calibration = calibration;
                 MagCalibrationButton.GetComponentInChildren<Text>().text = "停止地磁计校准";
                 this.cMaxVector = new Vector3(float.MinValue, float.MinValue, float.MinValue);
@@ -148,6 +149,7 @@ public class AimHandler : MonoBehaviour
             }
             else
             {
+                PointCorrector.ins = null;
                 List<Vector3> list = MagCalibrater.getRecords();
 
                 //停止校准时候,看看数组值
@@ -349,9 +351,13 @@ public class AimHandler : MonoBehaviour
                 if (Mag.y < cMinVector.y) cMinVector.y = Mag.y;
                 if (Mag.z < cMinVector.z) cMinVector.z = Mag.z;
 
+                Vector3 centerPoint = (this.cMaxVector + this.cMinVector) / 2;
+
                 //设置绘制图像相机的对应位置
-                this.ellipseScript.setCameraPos((this.cMaxVector + this.cMinVector)/2);
+                this.ellipseScript.setCameraPos(centerPoint);
                 this.ellipseScript.setCameraSize(this.cMaxVector - this.cMinVector);
+
+                PointCorrector.ins?.Update(centerPoint);
             }
             Mag = MagCalibrater.Update(Mag);
 

+ 1 - 2
Assets/BowArrow/Scripts/Bluetooth/o09Axis.cs

@@ -83,7 +83,7 @@ public class o0MagneticCalibraterEllipsoidFitting//默认在无磁干扰环境
     }
 
     [JsonIgnore]
-    List<Vector3> records = null;
+    public List<Vector3> records = null;
     [JsonIgnore]
     public Vector3 _Radius = default;
     public float[] Radius
@@ -274,7 +274,6 @@ public class o0MagneticCalibraterEllipsoidFitting//默认在无磁干扰环境
         if (Calibration)
         {
             records.Add(v);
-            if (records.Count > 6000) records.RemoveAt(0);
             return v;
         }
         if(_CorrectMatrix != null)

+ 1 - 2
Assets/BowArrow/test-ellipse/Ellipse.cs

@@ -5,7 +5,7 @@ using UnityEngine;
 public class Ellipse : MonoBehaviour
 {
     private ParticleSystem particleSystem0;
-    List<Vector3> arrayList = new List<Vector3>();
+    [System.NonSerialized] public List<Vector3> arrayList = new List<Vector3>();
 
     public Transform ellipseTran;
 
@@ -65,7 +65,6 @@ public class Ellipse : MonoBehaviour
 
     public void AddAndUpdatePointArray(Vector3 addPoint) {
         this.arrayList.Add(addPoint);
-        if (this.arrayList.Count > 6000) this.arrayList.RemoveAt(0);
         this.DrawPointCloud(this.arrayList);
     }
 

+ 50 - 0
Assets/BowArrow/test-ellipse/PointCorrector.cs

@@ -0,0 +1,50 @@
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+/*
+*需要解决的问题:渲染的点过多时App会卡死
+*解决方案:保证点在圆上均匀分布,并剔除多余的点
+*/
+public class PointCorrector {
+    Ellipse ellipse;
+    o0MagneticCalibraterEllipsoidFitting MagCalibrater;
+    public static PointCorrector ins;
+
+    public PointCorrector(
+        Ellipse ellipse, 
+        o0MagneticCalibraterEllipsoidFitting MagCalibrater
+        ) {
+        this.ellipse = ellipse;
+        this.MagCalibrater = MagCalibrater;
+    }
+
+    const int correctNeedPointCount = 3600; //需要收集多少点才开始进行剔除
+    int angleDivisionValue = 1; //多少角度分割为1个区间
+    const int angleDivisionValueMax = 6; //最大多少角度分割为1个区间
+    const float angleDivisionValueUpThreshold = 0.9f; //一轮点的剔除后,剩余的点超过百分之几时就加大角度分隔值
+
+    public void Update(Vector3 centerPoint) {
+        List<Vector3> li = this.ellipse.arrayList;
+        if (li.Count > correctNeedPointCount) {
+            HashSet<string> angleSet = new HashSet<string>();    
+            li.RemoveAll(p => {
+                Vector3 angle = Quaternion.LookRotation(p - centerPoint, Vector3.up).eulerAngles;
+                string key = Mathf.FloorToInt(angle.x / angleDivisionValue) + "_" + Mathf.FloorToInt(angle.y / angleDivisionValue);
+                if (angleSet.Contains(key)) {
+                    return true;
+                } else {
+                    angleSet.Add(key);
+                    return false;
+                }
+            });
+            Debug.LogWarning("剔除完成:剩余点数:" + li.Count);
+            if (li.Count > correctNeedPointCount * angleDivisionValueUpThreshold) {
+                angleDivisionValue = System.Math.Min(angleDivisionValue + 1, angleDivisionValueMax);
+                Debug.LogWarning("切割值尝试提升,当前值为" + angleDivisionValue);
+            }
+            MagCalibrater.records = li.ToList<Vector3>();
+        }
+    }
+}

+ 11 - 0
Assets/BowArrow/test-ellipse/PointCorrector.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e182afcee7463b048a877f6e28fb3754
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: