是否可以访问ARKit创建的网格?

问题描述 投票:0回答:1

我正在使用 SwiftUI 和 RealityKit 学习 AR,我从一个非常基本的实现开始,首先仅显示相机流。
稍后的虚拟对象应使用 ModelEntity 和 AnchorEntity 来放置。

应用程序:

import SwiftUI

@main
struct BasicARApp: App {
    var body: some Scene {
        WindowGroup {
            MainView()
        }
    }
}

主视图:

import SwiftUI
import RealityKit

struct MainView : View {
    var body: some View {
        ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
    
}

我想要的应用程序需要识别最靠近相机的物体。
要在 ARKit 生成的网格中找到该对象,Apple 文档 建议从网格中的某个位置进行光线投射,例如使用

if let result = arView.raycast(from: tapLocation, allowing: .estimatedPlane, alignment: .any).first { // … }  

但是我认为如果我可以直接访问网格,并过滤掉最靠近相机的节点,会更容易。

所以我的问题是:如何访问 ARKit 生成的网格?

ios swiftui arkit realitykit
1个回答
0
投票
Hlw @AndyJazz please check this one hope  it will help.

import SwiftUI
import RealityKit
import ARKit

struct ARViewContainer: UIViewRepresentable {
    var arView = ARView(frame: .zero)

    func makeUIView(context: Context) -> ARView {
        // Setting the ARView's delegate
        arView.session.delegate = context.coordinator
        return arView
    }

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

  
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, ARSessionDelegate {
        var parent: ARViewContainer

        init(_ parent: ARViewContainer) {
            self.parent = parent
        }

        
        func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
            for anchor in anchors {
                if let meshAnchor = anchor as? ARMeshAnchor {
                    
                    let meshGeometry = meshAnchor.geometry
                   
                    
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.