SwiftUI-3D模型加載與顯示

介紹

在增強(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模型展示")
        }
    }
}

效果

效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容