unity3D EasyAR 識別模型抖動解決方案


EasyAR引擎不知道什麼原因導致識別成功後,模型出現高頻率抖動,問官方無解後,嘗試按論壇裏的朋友的方式試驗

即,在模型抖動的幅度在一定範圍內的時候,不允許該模型抖動,但是這樣會導致平移相機時,模型的移動有卡頓。

如果大家有更好的改進方案,煩請告知一下本人,感謝!


首先需要在  Augmenter 設置世界中心爲 Augmenter

然後在ImageTarge 的 EasyImageTargetBehaviour類重寫Update方法


具體代碼如下

    protected override void Update()
        {
            base.Update();
            float myrx = 0;
            myrx = this.transform.localEulerAngles.x;
            while (myrx >= 360)//爲了讓判斷條件時方便,強制把所有不在1~270以內的數字,轉換爲-270~270
            {
                myrx -= 360;
            }
            while (myrx <= -360)
            {
                myrx += 360;
            }
            while (myrx > 270 && 360 - myrx >= 0)
                myrx = -(360 - myrx);
            float myry = 0;
            myry = this.transform.localEulerAngles.y;
            while (myry >= 360)
            {
                myry -= 360;
            }
            while (myry <= -360)
            {
                myry += 360;
            }
        
            while (myry > 270 && 360 - myry >= 0)
                myry = -(360 - myry);

            float myrz = 0;
            myrz = this.transform.localEulerAngles.z;
            while (myrz >= 360)
            {
                myrz -= 360;
            }

            while (myrz <= -360)
            {
                myrz += 360;
            }

            while (myrz > 270 && 360 - myrz >= 0)
                myrz = -(360 - myrz);
               //關鍵,當模型抖動超過一定範圍時,不修正模型的座標角度,記錄座標和角度
               if (((Math.Abs(this.transform.position.x - lastX) > 0.06 || Math.Abs(this.transform.position.y - lastY) > 0.06 || Math.Abs(this.transform.position.z - lastZ) > 0.06)&&
            (Math.Abs(this.transform.position.x - lastX) > 0.13 || Math.Abs(this.transform.position.y - lastY) > 0.13 || Math.Abs(this.transform.position.z - lastZ) > 0.13))||
            ( (Math.Abs(myrx - lastRX) > 3 &&Math.Abs(myry - lastRY) >3 &&Math.Abs(myrz - lastRZ) > 3)&& (Math.Abs(myrx - lastRX) > 6 || Math.Abs(myry - lastRY) > 6 || Math.Abs(myrz - lastRZ) > 6))
                {
                    lastX = this.transform.position.x;
                    lastY = this.transform.position.y;
                    lastZ = this.transform.position.z;
                    lastRX = myrx;
                    lastRY = myry;
                    lastRZ = myrz;
                this.transform.rotation = Quaternion.Euler(lastRX, lastRY, lastRZ);
                this.transform.position = new Vector3(lastX, lastY, lastZ);
                }
                else//模型抖動範圍過小時,修正模型座標爲上一次正確的座標
                {
             
                    this.transform.rotation = Quaternion.Euler(lastRX, lastRY, lastRZ);
                    this.transform.position = new Vector3(lastX, lastY, lastZ);
                }
           
        }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章