在第1課(6-1a)曾經提過,在Apple平台寫 AR 程式,主要有兩種框架組合,一是SceneKit + ARKit;二是RealityKit + ARKit。不管哪種組合,寫出來的 AR 程式都可在 iPhone, iPad 以及 Vision Pro 上執行。概念如下圖:
AR 程式對硬體要求較高,除了核心晶片(CPU/GPU/NPU)與相機鏡頭之外,還須配備加速度計(或稱加速規)、陀螺儀、磁力計等感測元件,因此無法在 Mac 或 Macbook 中執行,只支援 iPhone, iPad, Vision Pro 等產品,且若干功能還對軟硬體版本有額外要求。
本單元前5課介紹SceneKit,在熟悉SceneKit之後,只要再加上ARKit框架,就能做出AR程式。以最簡單的講法來說,SceneKit負責建構虛擬場景,而ARKit則負責融入實景場域。
不過,要動手寫 SceneKit + ARKit 程式,還有個小問題,就是只能使用 UIView 顯示,因為 ARKit 無法搭配 SceneView (如下圖)。以下我們會透過 UIViewRepresentable,將 UIView 轉換到 SwiftUI 格式。
第一步先來寫一個最簡化的AR程式,只要求開啟相機鏡頭:
// 補充(11a) 最簡AR程式:SceneKit + ARKit
// Tested by Heman, 2024/07/08
import SwiftUI
import SceneKit
import ARKit
struct 最簡AR: UIViewRepresentable {
func makeUIView(context: Context) -> SCNView {
let AR視圖 = ARSCNView()
if ARWorldTrackingConfiguration.isSupported {
print("支援AR")
let 設定 = ARWorldTrackingConfiguration()
AR視圖.session.run(設定)
} else {
print("不支援AR")
}
return AR視圖
}
func updateUIView(_ uiView: SCNView, context: Context) {
}
}
import PlaygroundSupport
PlaygroundPage.current.setLiveView(最簡AR())
這個小程式若在 iPad (透過Swift Playgrounds App)執行,會要求相機權限,以便開啟相機鏡頭,如下圖:
若在 macOS 執行,只會看到一個全白(或全黑,若深色模式)畫面,而不會開啟鏡頭。
程式中 UIViewRepresentable 規範用來將 UIView 轉成 SwiftUI 的格式(也就是View),規範要求建構兩個函式:makeUIView() 與 updateUIView()。
第一個函式 makeUIView() 在一開始會被呼叫一次,用來創造初始畫面(即回傳值),回傳值須符合 UIView 類型(或子類型);第二個函式 updateUIView() 目前暫時用不到,可保持空白但不可省略。