共用方式為


處理例外狀況

在大多數情況下,WLT 可以悄悄地偵測並修正追蹤錯誤,而不需要應用程式介入。

但有些例外狀況會導致應用程式可能想要調整的錯誤。

遺失追蹤是這類條件的範例。

追蹤可能會因為任何原因而隨時遺失。 感測器可能覆蓋、光源可能不足,或相機周圍可能沒有任何可見特徵可供追蹤。

本檔其他地方包含有關概念層級上這些特殊條件的更完整討論,包括旨在緩和它們的 WLT 功能。

在這裡,我們將深入探討應用程式開發人員如何(選擇性地)利用這些功能,在這些例外狀況期間自定義應用程序的行為。

AttachmentPoints

如這裡更完整討論,附件點是WLT與應用程式之間的合約,用於通知發生例外狀況的通知,以及應用程式可能用來回應的適當數據。

調整器元件

這類應用程式回應的實作會以「調整器」元件的形式提供。 其中的主要部分是 AdjusterFixed 元件。

AdjusterFixed 可以依目前方式使用,但瞭解其用途可能具有指示性,特別是對於想要進一步自定義行為的開發人員而言。

請務必辨識調整器元件提供兩個角色:

  1. 他們會管理基礎 AttachmentPoint。
  2. 它們提供應用程式回應例外狀況的實作。

AttachmentPoint 管理

檢查 Start()OnDestroy() 成員會擷取大部分的 AttachmentPoint 管理。

在 上 Start(),會建立基礎 AttachmentPoint,為 AdjusterFixed 的成員函式提供回呼(請參閱下方)。

在 中 OnDestroy(),這些回呼聯機會遭到切斷,而 AttachmentPoint 已釋出。

條件處理回呼

這兩個回呼會在這些例外狀況期間實作應用程式所需的行為。

處理追蹤狀態

HandleStateAdjust()中,AdjusterFixed 元件會停用目前未追蹤的片段中包含的物件。

        protected virtual void HandleAdjustState(AttachmentPointStateType state)
        {
            bool visible = state == AttachmentPointStateType.Normal;
            if (visible != gameObject.activeSelf)
            {
                gameObject.SetActive(visible);
            }
        }

雖然這個簡單的行為非常適合許多應用程式,但很容易想像當它不夠的情況。

  1. 對象應該隱藏,但不應該停用(應該繼續更新)。
  2. 慣用隱藏物件的替代方法(例如將物件移到遠裁剪平面之外)。
  3. 它不應該隱藏物件,而是應該以不同的材質轉譯(例如X光材質)。
  4. 應該轉譯替代物件,而不是隱藏物件。
  5. 等。

幸運的是,應用程式開發人員可以自由實作上述任何行為,或只受限於想像的其他行為。

指定自定義行為最簡單的方式是實作衍生自 AdjusterFixed 的自定義元件。 接著可以繼承 AttachmentPoint 管理,並覆寫處理程式以建立自定義行為。

處理重新置放

如概念檔所述,WLT 系統可以藉由將物件重新定位在凍結空間中,來決定對象在實體世界中的最佳位置。 它會透過 AttachmentPoint 機制通知應用程式該情況。

當然,應用程式可以忽略這類調整。 不過,AdjusterFixed (和 AdjusterMoving) 元件所提供的行為是立即套用該重新定位轉換。

        protected virtual void HandleAdjustLocation(Pose adjustment)
        {
            Pose pose = gameObject.transform.GetGlobalPose();
            pose = adjustment.Multiply(pose);
            gameObject.transform.SetGlobalPose(pose);
        }

這幾乎一律是應用程式想要的。 問題可能會問及為何有人想要覆寫 AdjusterFixed 的 HandlePositionAdjust() 函式。

當然,答案是,除了更正位置之外,應用程式可能還想要執行其他動作。 暫時性材質效果可能有助於通知用戶已進行變更。 重新定位可能會分散在幾秒鐘內。 或者,如果重新定位過於激烈,應用程式可能會偏好捨棄物件,而不是移動物件。

AdjusterFixed 與 AdjusterMoving

仔細查看 AdjusterMoving 元件會顯示它與它衍生自的 AdjusterFixed 元件幾乎完全相同。

兩者之間的差異在於 AdjusterMoving 假設其目標在環境周圍不斷移動。 因此,每個更新都會通知 WLT 系統其新的 Pose。

AdjusterMoving 的成本主要來自新增 Update() 函式,而不是函式內完成的工作。 不過,對於「大部分」固定的物件,而且不常從腳本移動,使用 AdjusterFixed 元件,並在每次移動對象之後呼叫 AdjusterFixed.UpdatePosition() 會比較有利。

自定義行為,但前提是您想要

同樣地,這裡的模式有望在整個世界鎖定工具中保持一致。 WLT 提供簡單但通常有用的基準行為。 希望此實作能夠:

  1. 滿足應用程式的需求。
  2. 提供基準實作,讓您增強。
  3. 提供範例實作,您可以從中執行。

另請參閱