ios - 重置 ARView 并再次运行 Coaching Overlay

标签 ios swift swiftui augmented-reality arkit

我有一个 ARView,它会在 coachingOverlay 成功完成后立即填充。

如何从另一个 View (Navbar) 调用一个函数来重置这个 ARView 并运行 coachingOverlay 来再次初始化 AR?

struct ContentView : View {
    var body: some View {
        ZStack {
            ARViewContainer().edgesIgnoringSafeArea(.all)
            VStack {
                Spacer()
                Navbar()
            }
            .padding()
        }
    }
}

struct ARViewContainer: UIViewRepresentable {

    func makeUIView(context: Context) -> ARView {

        let arView = ARView(frame: .zero)

        arView.addCoaching()

        let config = ARWorldTrackingConfiguration()
        config.planeDetection = .horizontal
        arView.session.run(config, options: [])

        return arView

    }

    func updateUIView(_ uiView: ARView, context: Context) {}

}

extension ARView: ARCoachingOverlayViewDelegate {
    func addCoaching() {
        let coachingOverlay = ARCoachingOverlayView()
        coachingOverlay.delegate = self
        coachingOverlay.session = self.session
        coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        coachingOverlay.goal = .anyPlane
        self.addSubview(coachingOverlay)
    }

    public func coachingOverlayViewDidDeactivate(_ coachingOverlayView: ARCoachingOverlayView) {
        // Load the "Box" scene from the "Experience" Reality File
        let boxAnchor = try! Experience.loadBox()

        // Add the box anchor to the scene
        self.scene.anchors.append(boxAnchor)
    }
}
struct Navbar: View {

    let arView = ARView()

    var body: some View {
        Button(action: {
            //
        }) {
            Image(systemName: "trash")
                .foregroundColor(Color.black)
                .padding()
        }
        .background(Color.white)
    }
}

最佳答案

要从 Navbar 调用指导覆盖和跟踪配置,请使用 coordinator属性(property)。

我想您不需要重置 ARView 本身。您需要做的就是使用以下选项重新运行 session :.resetTracking.removeExistingAnchors。它会删除以前的跟踪 map ,您可以从头开始。

arView.session.run(config, options: [.removeExistingAnchors, .resetTracking])

此外,如果您想将 Coaching Overlay 视为单次操作,然后必须将其关闭,请使用以下设置:

coachingOverlayView.activatesAutomatically = false

关于ios - 重置 ARView 并再次运行 Coaching Overlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62388053/

相关文章:

ios - Ionic 平台命令因 'Cannot read property ' split' of undefined' 突然失败

iphone - 如何在应用更新下载后再次调用 didFinishLaunchingWithOptions

ios - 如何从 UIActivityItemSource 函数返回多个值

ios - 如何从父函数运行子函数?

ios - 推回而不是 pepto 显示错误

ios - 连接 2 个 NSAttributedString

ios - 隐藏音量 HUD(避免使用加载 View )

swift - 滚动横幅 tvOS

nsoperationqueue - 使用结合框架的操作队列

ios - `Identifiable` 一致性返回类型泛型作为变量