ARKit 演示:增強現實電影製作

已發表: 2022-03-11

AR 和 VR 正在成為主流,所有頂級的高科技公司都在追求它們:蘋果有 ARKit,谷歌有 ARCore,微軟有自己的 HoloLens(當然還有 Unity)。 隨著一些應用程序受到公眾的廣泛關注,增強現實應用程序開發正成為移動開發人員非常渴望的技能。

在本文中,我想演示一個簡單但有意義的小應用程序,它不僅僅具有一個旋轉立方體。 誰還需要旋轉立方體? 讓我們製作矩陣。

ARKit 簡介

ARKit 是一個 Apple 框架,用於為 iOS 設備創建 AR 應用程序。 可以使用多個渲染器:SpriteKit 用於 2D 對象,SceneKit 用於 3D,如果我們想要實現自定義渲染器,則可以使用 Metal。

對於這個演示,我們將使用 SceneKit 來渲染和放置完全渲染的 3D 對象(刀)。

圖像:渲染器之間的區別

從 ARKit v2 開始,ARKit 支持五種類型的配置:

AROrientationTrackingConfiguration – 當您只想跟踪設備的方向時(例如,對於星座應用程序)。 使用這種配置,不會跟踪像側步這樣的物理運動,也不會影響場景中對象的位置或方向。

ARWorldTrackingConfiguration——這可能是 AR 最常用的配置,因為它支持大多數人認為的增強現實。 示例包括虛擬寵物或口袋妖怪狩獵應用程序。

ARFaceTrackingConfiguration – 此配置目前僅受 iPhone X 支持,因為它需要 TrueDepth 攝像頭(如 Face ID)。 此配置跟踪面部特徵及其與中性面部表情的相對偏移(例如,用戶可以在訂購前試用時尚太陽鏡的應用程序)。

ARImageTrackingConfiguration – 如果您有一組標記並且想要顯示動物跳出標記,那麼此配置適合您。 這些不必是卡片式標記,而是任何 2D 圖片。 你可以把相機對準蒙娜麗莎,她會轉過頭告訴你一些事情。 一個缺點是您必須事先說明圖像標記的物理尺寸是多少。

ARObjectScanningConfiguration – 此配置是 ARImageTrackingConfiguration 的 3D 版本。

在這個演示中,我們將在場景中添加刀具和子彈,我們希望有六個自由度,因此合適的工具是 ARWorldTrackingConfiguration。

應用概念

每個看過《黑客帝國》的人都記得尼奧(基努·里維斯飾)躲避子彈並在半空中阻止他們。 我們的應用程序將幫助我們從實時攝像機源中重新創建這個場景。 因此,我們可以創建自定義視頻來展示類似 Neo 的能力。

我們的應用程序將有子彈和刀具的 3D 模型。 電影中需要多少子彈或刀具取決於用戶。 如果您想花一些時間添加其他模型,應用程序代碼是開源的,可以在 GitHub (https://github.com/altaibayar/toptal_ar_video_maker) 上找到。 雖然這不是一個完整的 AR 教程,但如果您嘗試在 iOS 上進行 AR 應用程序開發,那麼演示和源代碼應該是很有價值的資源。

預期的用例場景如下:

  1. 讓一個朋友裝扮成 Neo(對於應用程序的運行不是絕對必要的,但在我們這樣做的時候最好看起來不錯)。
  2. 讓“Neo”站在離您約 10 米(30 英尺)的地方。
  3. 啟動應用程序並掃描地平面。
  4. 添加在“Neo”處飛行的子彈和刀具。
  5. 按住錄製按鈕錄製視頻,同時“Neo”執行一些很酷的動作來躲避或阻止子彈
  6. 釋放錄製按鈕並將視頻保存到您的庫中。

構建應用程序

如前所述,我們希望能夠在記錄所有 360 度場景的同時自由移動,並讓子彈和刀具適當地跟踪攝像機運動。

出於演示目的,我們將只有兩種類型的虛擬對象:刀和霰彈槍子彈。

刀是詳細的對象,我將使用來自 https://poly.google.com/view/3TnnfzKfHrq 的免費模型(感謝 Andrew)。

然而,霰彈槍子彈是簡單的球形物體,我們可以簡單地對它們進行編碼。我們將把它們做成金屬的和熾熱的以增加多樣性。 由於我們正在模擬霰彈槍,我們還將它們生成為分組集群。 為了讓聚類不費力,我們可以使用 GamplayKit 中的高斯隨機數生成器。

GameplayKit 是一個有用的工具,只要您需要隨機噪聲生成、狀態機、人工智能或基於概率的決策,它就會派上用場。

 override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }

類似的隨機偏移邏輯可用於刀具,但由於它們不表現為集群,因此可以使用簡單的隨機分佈。

應用架構

深入討論哪種架構範式是最好的,超出了這個演示的範圍。 有許多文章深入探討了該主題。

相反,我只會列出項目的結構,作為找到鏈接的 GitHub 項目的指南:主要組件是什麼,它們是如何連接的,以及為什麼選擇它們。

該應用程序只有三個屏幕:

PermissionViewController – 我們要求用戶授予應用程序訪問所需移動功能的屏幕。

  • 相機——顯然
  • 圖庫- 保存錄製的視頻和麥克風輸入
  • 麥克風- 我用來創建視頻的庫需要權限(默認情況下,來自麥克風的聲音將用作音軌的來源)。

ExportViewController – 此屏幕顯示錄製的視頻並提供共享或保存視頻的選項。

MainViewController – 所有的魔法都發生在這裡。

根據我的經驗,最好包裝所有必要的 ARKit 類,如 ARSession、ARConfiguration 和所有獨特類型的 SCNNode。 這樣,代碼是不言自明的。

ARSession 被繼承到 ToptalARSession 中,新的會話類只有三個方法:我們設置所需的所有內容的類構造函數以及 resetTracking 和 pauseTracking 方法。

該應用程序識別四種獨特類型的 SCNNode:

  • KnifeNode – 表示刀 3D 對象,並自動加載 3D 刀作為其幾何圖形。
  • BulletsNode – 此節點代表一組霰彈槍彈。 隨機高斯噪聲、顏色和物理照明模式是自動設置的。

    使用 KnifeNode 或 BulletsNode 的類不需要特殊或額外的工作,它們可以用作自定義應用程序以添加更多種類的 3D 對象的模板。

  • ReticleNode – 包裹一個 3D 模型,該模型出現在地板上方的場景中,以顯示將添加刀具或子彈的位置。
  • DirectionalLightNode – 這是一個代表垂直光指向下方的節點。

參考文獻和學分

刀型號:https://poly.google.com/view/3TnnfzKfHrq

從 SCNScene 錄製:https://github.com/svtek/SceneKitVideoRecorder

按鈕圖標,ARKit 演示應用程序:https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality