轉(zhuǎn)自:http://dev.arinchina.com/177wz/ar9625/9625/1
命名空間:UnityEngine.VR.WSA.SurfaceObserver
本文主要介紹如何在Unity項目中使用空間映射功能。Unity中提供了對空間映射功能的支持,可通過以下方式提供給開發(fā)者:
1. 可以在HoloToolkit項目中找到空間映射組件,會提供便捷快速地路徑開始使用空間映射特性。
2. 底層空間映射API,以便開發(fā)者能夠完全控制空間映射特性,滿足定制復(fù)雜應(yīng)用的需求
為了在應(yīng)用中使用空間映射功能,需要在AppxManifest(應(yīng)用權(quán)限清單)中設(shè)置啟用SpatialPerception性能。
設(shè)置SpatialPerception性能
為了使應(yīng)用能夠使用空間映射數(shù)據(jù),SpatialPerception性能必須被啟用。
可以通過使用以下步驟開啟該功能:
1. 在Unity編輯器中,進入Player Settings選項(Edit > Project Settings > Player)
2. 點擊Window Store選項卡
3. 展開Publish Settings選項,并在Capabilities列表勾選SpatialPerception選項
注意:如果你已經(jīng)把Unity項目導(dǎo)出為Visual Studio項目,你需要重新導(dǎo)出修改后的項目到新文件夾或者手動在Visual Studio中修改AppxManifest應(yīng)用清單。
空間映射特性也要求MaxVersionTested版本最低為10.0.10586.0:
1. Visual Studio項目解決方案,雙擊Package.appxmanifest文件,并右鍵選中查看源碼方式打開
2. 找到TargetDeviceFamily這一行,并將MaxVersionTested="10.0.10240.0"修改為MaxVersionTested="10.0.10586.0"
3. 保存Package.appmanifest文件
空間映射組件
HoloToolkit為簡單快速集成空間映射特性至應(yīng)用提供了幾個方案。
對于默認的空間映射需求,推薦使用SpatialMappingComponent目錄下的SpatialMappingCollider.cs和SpatialMapppingRenderer.cs腳本。如果你需要從網(wǎng)絡(luò)或者文件載入空間網(wǎng)格,可以使用更為合適的SpatialMapping目錄下的腳本。
更多的細節(jié)可以在HoloToolkit Github主頁上找到。
如何使用API
命名空間:UnityEngine.VR.WSA
類型SurfaceObserver,SurfaceChange,SurfaceData,SurfaceId
以下是應(yīng)用推薦的使用空間映射API性能的大致流程。
設(shè)定SurfaceObserver對象
需要為每一個需要空間映射數(shù)據(jù)的空間區(qū)域在應(yīng)用中初始化一個SurfaceObserver對象。

通過調(diào)用SetVolumeAsSphere、SetVolumeAsAxisAlignedBox、 SetVolumeAsOrientedBox、 或 SetVolumeAsFrustum方法,為每個SurfaceObserver對象指定它們需要獲取數(shù)據(jù)的空間區(qū)域。你還可以通過再次調(diào)用它們,重新定義檢測空間區(qū)域范圍。

當(dāng)你調(diào)用SurfaceObserver.Update()時,需要提供每一個SurfaceObserver對象檢測區(qū)域中的空間表面(spatial surface)指定事件處理方法。

處理空間表面變化
在此有幾個需要處理的典型情形。Added和Updated狀態(tài)可使用相同代碼處理,Removed狀態(tài)需要使用另一種代碼處理。
· 在Added和Updated情形下,我們從字典中添加或獲取代表當(dāng)前網(wǎng)格的對象,使用必要的組件來創(chuàng)建一個SurfaceData結(jié)構(gòu)體,然后調(diào)用RequestMeshDataAsync通過在場景中使用網(wǎng)格數(shù)據(jù)和位置來填充對象。
· Removed情況下,我們從字典中移除網(wǎng)格代表的對象并將它銷毀。


處理DataReady事件
OnDataReady事件會接收到一個SurfaceData對象,它包含了WorldAnchor、MeshFilter和MeshCollider對象數(shù)據(jù),表示了當(dāng)前關(guān)聯(lián)的空間表面最新狀態(tài)。通過訪問Mesh Filter對象的Mesh數(shù)據(jù)可以進行性能分析或者網(wǎng)格處理。使用最新的Mesh數(shù)據(jù)來渲染空間表面并將它用于物理碰撞或者射線擊中對象。必須確認SurfaceData內(nèi)容不是空的。
處理更新操作
SurfaceObserver.Update()只能延遲調(diào)用,不是每幀都可更新都調(diào)用。

HoloToolkit
HoloToolkit項目是基于Unity API封裝的一系列很有用的全息開發(fā)代碼工具集合,能幫助開發(fā)者快速集成HoloLens特性。
故障問題解決
· 確保你設(shè)置了 SpatialPreception性能
· 當(dāng)追蹤焦點丟失時,在接下來的OnSurfaceChanged事件處理中將會移除所有網(wǎng)格。