HoloLens開發手記 - Unity之World Anchor空間錨


World Anchor空間錨提供了一種能夠將物體保留在特定位置和旋轉狀態上的方法。這保證了全息對象的穩定性,同時提供了后續在真實世界中保持全息對象位置的能力。簡單地說,你可以為全息物體來添加空間錨點,這樣就能在后續步驟中將全息物體准確恢復到它原來的位置。

 

 

Adding a World Anchor 添加空間錨


 

 

命名空間: UnityEngine.VR.WSA

類型: WorldAnchor

 

Unity中添加空間錨的方式很簡單,如下:

 

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

 

Removing a World Anchor 移除空間錨


 

如果你不再想將GameObject固定在特定位置,同時在場景中也不想移動它,,那么可以調用Destroy()方法來銷毀WorldAnchor組件,如下:

 

Destroy(gameObject.GetComponent<WorldAnchor>());

 

如果你想要立刻在場景中移動對象,那么需要調用DestroyImmediate()來銷毀空間錨組件,如下:

 

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

 

Moving a World Anchored GameObject 移動錨定的全息對象


 

當全息對象已附加空間錨組件后,它不能被移動。如果你需要一定全息對象的話,那么你必須這樣做:

  1. 立刻銷毀空間錨組件
  2. 移動全息對象
  3. 添加一個新的空間錨到全息對象上
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

 

Handling Locatability Changes 處理可定位能力的變化


 

在某個時間點,空間錨可能不能夠在世界中被定位到。如果這種情況發生,Unity將不能更新錨定對象的位置。在應用運行時,這也肯能會發生變化。不能夠及時處理可定位能力的變化,可能會導致對象不會出現在准確的位置上。

為了追蹤可定位能力的變化,需要采取如下做法:

  1. 訂閱OnTrackingChanged事件
  2. 處理此事件

 

訂閱事件

代碼如下:

 

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

 

處理OnTrackingChanged事件

代碼如下:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
       // 根據定位狀態簡單的顯示或者隱藏對象
    self.gameObject.SetActiveRecursively(located);
}

 

設定明確的初始狀態

有時空間錨能夠立刻被定位到。這時候,給對象添加空間錨后,空間錨組件的isLocated屬性值將會被設為true,這是OnTrackingChanged事件將不會被觸發。因此,在添加空間錨組件后,推薦立刻使用初始的isLocated狀態去調用OnTrackingChanged事件,如下:

 

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM