介紹
在增強(qiáng)現(xiàn)實(shí)(AR)應(yīng)用中,3D 模型的展示是最基礎(chǔ)也是最核心的功能之一。無論是家具擺放、產(chǎn)品預(yù)覽,還是虛擬角色展示,幾乎所有 AR App 都依賴于 3D 模型的加載與渲染。本文將介紹如何使用 SwiftUI 和 SceneKit 框架,在 iOS 應(yīng)用中加載并展示一個(gè) .usdz 格式的 3D 模型。
為什么使用USDZ?
Apple 推薦在 iOS 和 ARKit 應(yīng)用中使用 .usdz 格式的 3D 模型。它具備以下優(yōu)勢:
- 支持物理渲染(PBR)材質(zhì)。
- 可直接在 Xcode 和 Quick Look 中預(yù)覽。
- 與 RealityKit 和 SceneKit 兼容性好。
通過 Apple 的 Reality Converter 工具可以將 .obj、.fbx、.gltf、.glb 等格式的模型其轉(zhuǎn)換為 .usdz,方便在項(xiàng)目中使用。
使用SceneKit加載3D模型
雖然 ARKit 推薦使用 RealityKit 進(jìn)行開發(fā),但在非 AR 場景下(如普通模型預(yù)覽),SceneKit 仍是一個(gè)非常強(qiáng)大的工具,支持復(fù)雜的模型渲染與交互。
import SceneKit
import SceneKit.ModelIO
import SwiftUI
class Model: ObservableObject {
@Published var scene: SCNScene?
init() {
load3DModel()
}
// MARK: 加載3D模型
func load3DModel() {
guard let url = Bundle.main.url(forResource: "test", withExtension: "usdz") else { return }
let asset = MDLAsset(url: url)
asset.loadTextures()
let scene = SCNScene(mdlAsset: asset)
self.scene = scene
}
}
使用SCNView展示模型
通過 UIViewRepresentable 將 SCNView 集成進(jìn) SwiftUI,實(shí)現(xiàn)模型的預(yù)覽和交互(支持旋轉(zhuǎn)、縮放等)。
struct SceneView: UIViewRepresentable {
var scene: SCNScene
func makeUIView(context: Context) -> SCNView {
let sceneView = SCNView()
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.scene = scene
return sceneView
}
func updateUIView(_ uiView: SCNView, context: Context) {
uiView.scene = scene
}
}
SwiftUI集成
struct ContentView: View {
@StateObject var model = Model()
var body: some View {
NavigationStack {
VStack {
if let scene = model.scene {
SceneView(scene: scene)
.frame(width: 400, height: 400)
.padding()
}
}
.navigationTitle("3D模型展示")
}
}
}
效果

效果