天天看點

【iOS-ARKit】掃描和檢測3D對象-Scanning and Detecting 3D ObjectsOverviewSee Also

記錄真實世界對象的空間特征,然後使用結果在使用者環境中查找這些對象并觸發AR内容。

Overview

建構令人信服的AR體驗的一種方法是識别使用者環境的特征并使用它們觸發虛拟内容的外觀。 例如,當使用者将他們的裝置指向顯示的雕塑或工件時,博物館應用可以添加互動式3D可視化。

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

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

此示例代碼項目提供了多種方式來使用對象檢測:

  • 運作應用程式掃描現實世界的對象并導出參考對象檔案,您可以在自己的應用程式中使用該檔案來檢測該對象。
  • 使用此示例應用程式中示範的

    ARObjectScanningConfiguration

    ARReferenceObject

    類将引用對象記錄為您自己的資産生産管道的一部分。
  • 在世界跟蹤AR會話中使用

    detectionObjects

    來識别參考對象并建立AR互動。

使用iOS應用程式掃描真實世界對象

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

【iOS-ARKit】掃描和檢測3D對象-Scanning and Detecting 3D ObjectsOverviewSee Also
  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

執行個體,将這些對象提供給

ARWorldTrackingConfiguration

detectionObjects

屬性,然後使用該配置運作ARSession:

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

當ARKit檢測到您的一個參考對象時,會話會自動将相應的

ARObjectAnchor

添加到其錨點清單中。 要響應正在識别的對象,請實施一個适當的

ARSessionDelegate

ARSCNViewDelegate

ARSKViewDelegate

方法,以報告添加到會話的新錨點。 例如,在基于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

物體檢測

  • ARReferenceObject
  • ARObjectAnchor
  • ARObjectScanningConfiguration