1. 程式人生 > >【iOS-ARKit】掃描和檢測3D物件-Scanning and Detecting 3D Objects

【iOS-ARKit】掃描和檢測3D物件-Scanning and Detecting 3D Objects

記錄真實世界物件的空間特徵,然後使用結果在使用者環境中查詢這些物件並觸發AR內容。

Overview

構建令人信服的AR體驗的一種方法是識別使用者環境的特徵並使用它們觸發虛擬內容的外觀。 例如,當用戶將他們的裝置指向顯示的雕塑或工件時,博物館應用可以新增互動式3D視覺化。

在iOS 12中,您可以通過在ARKit中啟用物件檢測來建立此類AR體驗:您的應用程式提供參考物件,它可以對已知真實世界物件的三維空間要素進行編碼,並且在AR session過程中,ARKit會告訴您的應用何時何地檢測到相應的真實世界物件。

This sample code project provides multiple ways to make use of object detection:

此示例程式碼專案提供了多種方式來使用物件檢測:

  • 執行應用程式掃描現實世界的物件並匯出參考物件檔案,您可以在自己的應用程式中使用該檔案來檢測該物件。
  • 使用此示例應用程式中演示的 ARObjectScanningConfigurationARReferenceObject 類將引用物件記錄為您自己的資產生產管道的一部分。
  • 在世界跟蹤AR會話中使用 detectionObjects 來識別參考物件並建立AR互動。

使用iOS應用程式掃描真實世界物件

掃描和定義ARKit可用於檢測的參考物件的程式設計步驟非常簡單。 (請參閱下面的“在AR會話中建立參考物件”。)但是,建立的參考物件的保真度以及您在自己的應用程式中檢測參考物件的成功取決於掃描時與物體的物理互動。 在您的iOS裝置上構建並執行此應用程式,以便通過一系列獲取高質量掃描資料的步驟,從而生成可用於在自己的應用程式中進行檢測的參考物件檔案。

  1. 準備掃描。第一次執行時,應用程式會顯示一個框,粗略估計任何真實世界物體在相機檢視中居中顯示的大小。將要掃描的物件放置在沒有其他物件的表面上(如空的桌面)。然後移動裝置,使物件顯示在框中居中,然後點選下一步按鈕。
  2. 定義邊界框。在掃描之前,您需要告訴應用程式世界的哪個區域包含您要掃描的物件。拖動以3D方式移動框,或者按住框的一側,然後拖動以調整其大小。 (或者,如果您不改變框,則可以在物件周圍移動,並且應用程式將嘗試自動在其周圍放置一個框。)確保邊界框僅包含要掃描的物件的功能(不是來自環境),然後點選掃描按鈕。
  3. 掃描物件。四處移動以從不同角度檢視物件。該應用程式會突出顯示邊界框的各個部分,以指示您何時掃描足以從相應方向識別物件。請務必掃描您希望您的應用的使用者能夠識別該物件的各個方面。掃描完成後,應用程式自動進入下一步,或者點選“停止”按鈕手動繼續。
  4. 調整原點。該應用程式顯示x,y和z座標軸線,顯示物件的錨點或原點。拖動圓圈以將原點相對於物件移動。在這一步中,您還可以使用新增(+)按鈕以USDZ格式載入3D模型。應用程式會在檢測到真實世界物件時顯示AR中出現的模型,並使用模型的大小來調整參照物件的比例。完成後點選測試按鈕。
  5. 測試和匯出。該應用程式現在建立了一個 ARReferenceObject 並重新配置了會話以檢測它。在不同的環境和光照條件下,從不同角度觀察真實世界的物體,以驗證ARKit能夠可靠地識別其位置和方向。點選匯出按鈕開啟分享表以儲存完成的 .arobject 檔案。例如,您可以使用AirDrop輕鬆將其傳送到您的開發Mac,或將其傳送到“檔案”應用程式以將其儲存到iCloud Drive。

注意:參考物件僅包含ARKit識別現實世界物件所需的空間特徵資訊,並不是該物件的可顯示3D重建。

檢測AR體驗中的參考物件

您可以使用Xcode資產目錄在應用程式中捆綁引用物件以用於檢測:

  1. 開啟專案的資產目錄,然後使用新增按鈕(+)新增新的AR資源組。
  2. 將.arobject檔案從Finder拖到新建立的資源組中。
  3. 或者,對於每個參考物件,請使用檢查員為自己的使用提供一個描述性名稱。

注意:將想要在同一個會話中查詢的所有物件放入資源組中,並使用單獨的資源組來儲存一組物件以在單獨的會話中使用。 例如,博物館應用程式可能會使用單獨的會話(並因此分開資源組)來識別博物館不同側翼的顯示。

要在AR會話中啟用物件檢測,請將要檢測的引用物件載入為 ARReferenceObject 例項,將這些物件提供給ARWorldTrackingConfigurationdetectionObjects 屬性,然後使用該配置執行ARSession:

let configuration = ARWorldTrackingConfiguration()
configuration.detectionObjects = ARReferenceObject.referenceObjects(inGroupNamed: "gallery", bundle: nil)
sceneView.session.run(configuration)

當ARKit檢測到您的一個參考物件時,會話會自動將相應的 ARObjectAnchor 新增到其錨點列表中。 要響應正在識別的物件,請實施一個適當的 ARSessionDelegateARSCNViewDelegateARSKViewDelegate 方法,以報告新增到會話的新錨點。 例如,在基於SceneKit的應用程式中,您可以實現 renderer:didAddNode:forAnchor: 向場景新增3D資產,自動匹配錨點的位置和方向

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    if let objectAnchor = anchor as? ARObjectAnchor {
        node.addChildNode(self.model)
    }
}

為了獲得物件掃描和檢測的最佳效果,請遵循以下提示:

  • 掃描和檢測物體時,ARKit會尋找清晰,穩定的視覺細節區域。 詳細的紋理物體比普通或反射物體更適合檢測。
  • 物件掃描和檢測針對小到足以放在桌面上的物件進行了優化。
  • 要檢測的物體必須與掃描的參考物體具有相同的形狀。 剛性物體比軟體或彎曲,扭曲,摺疊或以其他方式改變形狀的物品更適合檢測。
  • 當要檢測的真實世界物體的照明條件與掃描原始物體的條件類似時,檢測效果最佳。 一致的室內照明效果最好。
  • 高質量的物件掃描需要峰值裝置效能。 使用最新的高效能iOS裝置掃描的參考物件適用於在所有ARKit支援的裝置上進行檢測。

在AR會話中建立參考物件

此示例應用程式提供了一種建立參考物件的方法。 您還可以在自己的應用中掃描引用物件,例如,構建資產管理工具以定義進入其他應用的AR內容。

參考物件對ARKit用於跟蹤裝置位置和方向的內部空間對映資料進行編碼。 要啟用物件掃描所需的高質量資料收集,請使用ARObjectScanningConfiguration 執行會話:

let configuration = ARObjectScanningConfiguration()
configuration.planeDetection = .horizontal
sceneView.session.run(configuration, options: .resetTracking)

在物件掃描AR會話期間,從各個角度掃描物件以確保收集足夠的空間資料以識別它。 (如果您正在構建自己的物件掃描工具,請幫助使用者完成本示例應用程式提供的相同步驟。)

掃描完成後,呼叫createReferenceObjectWithTransform:center:extent:completionHandler: 從會話對映的使用者環境區域生成一個ARReferenceObject:

// Extract the reference object based on the position & orientation of the bounding box.
sceneView.session.createReferenceObject(
    transform: boundingBox.simdWorldTransform,
    center: float3(), extent: boundingBox.extent,
    completionHandler: { object, error in
        if let referenceObject = object {
            // Adjust the object's origin with the user-provided transform.
            self.scannedReferenceObject =
                referenceObject.applyingTransform(origin.simdTransform)
            self.scannedReferenceObject!.name = self.scannedObject.scanName
            creationFinished(self.scannedReferenceObject)
        } else {
            print("Error: Failed to create reference object. \(error!.localizedDescription)")
            creationFinished(nil)
        }
})

當檢測到參考物件時,ARKit根據參考物件定義的原點報告其位置。 如果要放置看起來與真實世界物件位於同一表面上的虛擬內容,請確保將參照物件的原點放置在現實世界物件所在的位置。 要在捕獲 ARReferenceObject 之後調整原點,請使用referenceObjectByApplyingTransform: 方法。

獲取ARReferenceObject之後,可以立即使用它來檢測(請參閱上面的“在AR Experience中檢測參考物件”),或將其另存為 .arobject 檔案,以便在稍後的會話或其他基於ARKit的應用程式中使用。 要將物件儲存到檔案,請使用exportObjectToURL:previewImage:error: 方法。 在該方法中,您可以提供Xcode的真實世界物件的圖片以用作預覽影象。

See Also

物體檢測