ARKit加载多个usdz模型文件并点击切换显示,解决切换卡顿

实现效果如上所示,可以点击模型切换显示,加入了特征点显示的debugOptions,所以界面上会显示很多特征点。刚开始的时候,因为没有预加载模型文件,导致点击切换的时候再加载,就会出现卡顿一下的现象,所以做了优化处理,程序刚启动,就加载所有的模型文件,后续切换就很顺畅了。

1.先在官网下载模型文件并导入到xcode中

2.运行代码

Swift 复制代码
import ARKit
import RealityKit
import SwiftUI

struct ContentView: View {
    let modelName = ["biplane", "drummertoy", "pancakes", "pegasus"]
    var modelMap: [String: ModelEntity] = [:]

    @State private var curModel: ModelEntity

    init() {
        print("init app")
        for model in modelName {
            let modelEntry = try! ModelEntity.loadModel(named: "\(model).usdz")
            self.modelMap[model] = modelEntry
        }
        self.curModel = self.modelMap[self.modelName.first!]!
    }

    var body: some View {
        VStack {
            ARViewContainer(curModel: $curModel)
            HStack {
                ForEach(modelName, id: \.self) {
                    model in
                    Image(model).resizable().frame(width: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, height: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/).onTapGesture {
                        print("click model: \(model)")
                        // 更新当前模型
                        curModel = self.modelMap[model]!
                    }
                }
            }.padding(.horizontal)
        }
        .edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {
    @Binding var curModel: ModelEntity

    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        arView.debugOptions = .showFeaturePoints

        // 配置 AR 会话,启用平面检测
        let configuration = ARWorldTrackingConfiguration()
        // 启用水平面检测
        configuration.planeDetection = [.horizontal]
        arView.session.run(configuration)

        // 创建一个水平面锚点
        let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: SIMD2<Float>(0.2, 0.2)))

        // 加载usdz模型文件
        let modelEntry = curModel
        modelEntry.position = [0, 0, 0]
        modelEntry.scale = [0.01, 0.01, 0.01]
        anchor.addChild(modelEntry)

        // 创建一个灯光
        let light = PointLight()
        light.position = [0, 1, 0]
        anchor.addChild(light)

        // 将锚点添加到场景中
        arView.scene.anchors.append(anchor)

        // 添加触摸事件识别器
        let tapGestureRecognizer = UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleTap(_:)))
        // 给arview添加动作识别
        arView.addGestureRecognizer(tapGestureRecognizer)

        return arView
    }

    func updateUIView(_ uiView: ARView, context: Context) {
        print("update ui view")
        // 删除之前的模型
        uiView.scene.anchors.removeAll()
        // 更新模型
        let modelEntry = curModel
        modelEntry.position = [0, 0, 0]
        modelEntry.scale = [0.01, 0.01, 0.01]
        let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: SIMD2<Float>(0.2, 0.2)))
        anchor.addChild(modelEntry)
        uiView.scene.anchors.append(anchor)
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }
}
相关推荐
qq_4592344211 天前
【题库】| 商用密码应用安全性评估从业人员考核题库(四十)
职场和发展·密码学·学习方法·考核·商用密码·商用密码应用安全性评估·密评
敲敲了个代码11 天前
[特殊字符] 空数组的迷惑行为:为什么 every 为真,some 为假?
前端·javascript·react.js·面试·职场和发展
诚思报告YH12 天前
视频面试软件市场洞察:2026 - 2032年复合年均增长率(CAGR)为10.3%
面试·职场和发展
重生之后端学习12 天前
74. 搜索二维矩阵
开发语言·数据结构·算法·职场和发展·深度优先
tyb33333312 天前
leetcode:吃苹果和队列
算法·leetcode·职场和发展
Pitiless-invader12 天前
MySQL 相关知识及面试问题汇总
面试·职场和发展
重生之后端学习12 天前
35. 搜索插入位置
java·数据结构·算法·leetcode·职场和发展·深度优先
逆境不可逃12 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
筱昕~呀12 天前
冲刺蓝桥杯-DFS板块(第二天)
算法·蓝桥杯·深度优先
zheshiyangyang12 天前
前端面试基础知识整理【Day-10】
前端·面试·职场和发展