觀看 WWDC23 Explore enhancements to RoomPlan 筆記
RoomPlan 使用 ARKit 提供的先進機器學習算法,可以檢測牆壁、窗戶、門以及其他房間的物品。
RoomCaptureView API 可幫助將掃描體驗的結果直接整合到 App 中,最後還可以導出 USDZ 文件
可結合使用 RoomPlan 和 ARKit 的新方法
我們使用 RoomCaptureSession
時,預設用 ARSession
作為核心運作
但現在 iOS 17 我們可以自定義 ARSession
和 ARWorldTrackingConfiguration
,從而我們可以以新的方式,在同一個工作流程中結合使用 RoomPlan
和 ARKit
Increase immersion: 其中一種結合使用 RoomPlan
和自定義 ARSession
的方式,就是將 RoomPlan
的結果與 ARKit
的場景幾何和平面檢測進行整合,已在虛擬內容和真實世界幾何之間創造更加沈浸式的互動
Add photos and videos to RoomPlan scans: 使用 ARKit
的高質量圖像捕捉,來收集空間的照片顯示,同時結合 RoomPlan
以創造更豐富的房屋 3D 模型圖列表
Seamlessly integrate RoomPlan with your ARKit app: 將 RoomPlan
作為現有 AR 體驗的一部分,可以在不破壞現有 ARAnchors
的情況下,整合來自 RoomPlan
的結果
現在 RoomCaptureSession
改成可以在 init input 客製化 ARSession
。
還有在 stop
function 新增參數
新的 MultiRoom API 用於將單獨的房間掃描合併為更大的結構
原先掃描了多個房間,最後要合併時,會遇到每個 3D Model 的座標原點和方向都是不同的,要合併有困難
其次,就算手動拼裝起來,但有些重疊的部分會有問題,例如:牆壁,會變成重複的牆
座標系統不同的問題:
我們的目標是要讓所有掃描結果都位於相同的座標系統中,因此我們可以採用兩個方法來解決
在此之前的 RoomPlan
中,如果 RoomCaptureSession
停止, ARSession
就會暫停,所以每次的掃描都具有不同的座標系統
而現在 API stop
function 中有新的參數,可將 pauseARSession
設置為 false,這樣的話 ARSession
可以繼續進行下一次掃描,直到我們再次暫停 ARSession
為止,使用這種方法,我們可以確保各次掃描中,執行的都是同一個 ARSession
,這樣就可以保證所有掃描結果共用一個世界座標系統
這方法適合用於需要分幾次對單個房間進去掃瞄的情況,例如隔天或隔週在對同一個位置進行掃描
主要做法是要把那次掃描裡的 ARWorldMap
儲存起來,而後續的掃描可以將上次儲存的 ARWorldMap
拿來使用,進行重新定位,然後這樣也可以確保一系列的掃描結果都是共享同一個座標系統
在每次掃描中,我們都會使用 RoomBuilder API
來生成單獨的 CapturedRoom
,然後就像之前展示的,提到的兩個方法 Continuous ARSession
和 ARSession relocalization
,所有 CapturedRoom
都會位於同一個 3D 空間中
下圖是 RoomBuilder
的輸出,包含了 3 個 CapturedRooms
,然後我們可以使用一個新的合併 API StructureBuilder
來將這些 CapturedRooms
合併為一個大結構( CapturedStructure
)
接下來看 API 如何使用
Single-floor residential house: 最適合單層住宅,通常包含一到四個臥室、廚房及客廳
House area: 2000 sq ft: 建議最大總面積不要超過 2,000 平方英尺,約 186 平方公尺,約 56 坪
Lighting: minimum 50 lux: 建議使用 50 勒克司或更高的良好照明,這樣才有更好的影像品質以及 AR 跟蹤的表現
可以在使用 RoomCaptureView 時有旁白輔助,提供聲音反饋的功能,對看到的內容進行描述
RoomPlan 的改進
現在針對掃描的能力有大大的提升,例如:傾斜和彎曲的牆壁、物品的識別:洗碗機、烤箱、水槽等,嵌入式廚房物品
單座、L 型或簡單的方形沙發都能檢測
新增了一些東西
現在多一個 Section
Surface 新增的部分
Object 新增的部分
Surface 和 Object 共同有的特性多了 Parent
例如窗戶的 Parent 是牆,椅子的 Parent 是桌子,洗碗機的 Parent 是儲物櫃
接下來一些範例,更詳細了解這些改變
前面提到的 Polygon 多邊形的牆壁也能偵測出來
floor 地板也能處理
洗碗機、烤箱和水槽的 Parent 會嵌在畫面中
我們之前會用 Category 來描述物品,但是會有一些侷限,例如椅子,這個椅子 Category 可以存在多種類型,像是凳子、餐椅及辦公椅等,而且這些椅子的功能也各不相同。
為了更好表示這些物品,現在多了剛剛提到的 Attributes ,來精準描述物品內容
導出功能的增強以實現新工作流程
透過專門的 UUID 可以在 USDZ 檔案中與 Room 上的物品作關聯
以前要把 CapturedRoom
導出時,有兩個方向,一個是接導出 USDZ 格式的檔案,另外一個則是可以在 Encode 後導出 JSON/Plist 檔案,而現在在 export
function 多一個參數 metadataURL: URL?
。
這 metadata 導出後可以對兩邊(USDZ 及 Metadata )的資料進行關聯,這樣看已掃描的房間時,就可以查詢 Surface 或 Object 的附加資料
將 Category 和 Attribute 映射到 Model URL
所以最後導出的 USDZ 檔案會包含這些 model (Sections, Surfaces, Category)
如何建立自己的小型資源目錄 (3D model catalog)
Parse categories and attributes
首先解析 RoomPlan
支持的 categories 及 attributes,下方的 code 就可以把目錄的內容準備就緒
Associate models
接著為每個 category 和 attribute 關聯一個模型
最後再把索引文件保存成 Plist,並將目錄保存為 Bundle 文件
Instantiate ModelProvider
然後實例化一個 Model Provider
每次導出 RoomModel 或希望使用 Model Provider
將物品關聯到模型時,可以使用該目錄的 Bundle 文件,生成一個 Model Provider
,而我們需要做的就是把 catalog.categoryAttributes
找到對應的 modelURL
,然後再沒有 attributes 的情況下將 modelURL
關聯到目錄
Export CapturedRoom
最後使用這個 instance 導出一個 CaptruedRoom
,這個 USDZ 檔其中的 3D 模型就與掃描完全對應了,假如要獲得更好的效果,可以導入到 Blender 等 DCC 工具中,增加光照和陰影
Custom ARSession suprot: 自定義的 ARSession
,例如可以在掃描過程中捕獲高質量的影像跟聲音
New MultiRoom experiences: 可以對多個房間進行掃描,並使用新的 StructureBuilder API
對整個房屋生成合成 3D 模型
Accessibility improvements: 改善視力不佳用戶的掃描體驗,支持旁白
More accurate representation: 更精準描述掃描的房間
New workflows to customize RoomPlan output: 可以使用最新的導出 API,將自定義目錄中的 3D 模型分配給相應的掃描物品