我正在使用 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 生成的网格?
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
}
}
}
}
}