ARKit3和swiftUI

时间:2019-12-01 11:21:04

标签: swiftui arkit

我试图在swiftUI项目中使用ARKit imageDetection功能,但在实现渲染器时遇到麻烦。到目前为止,这是发生的事情: 在Xcode 11.2中,可以使用swiftUI启动一个新的ARKit项目。 UIViewRepresentable协议用于返回ARView的ARViewContainer结构中。在该结构内部创建了一个ARView对象/ var,该“ arView”显然具有“会话” vobject。 我想我可以像使用SceneKit一样设置这个(AR)会话对象:

    struct ScanARViewContainer: UIViewRepresentable {

    makeUIView(context: Context) -> ARView {

    //let arView = MyARView(frame: .zero)
    //   changed this line to the following to have an own renderer
    let arView = ARView(frame: .zero, cameraMode: ARView.CameraMode.ar, automaticallyConfigureSession: false)


    guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else {
        fatalError("Missing expected asset catalog resources.")
    }
    let configuration = ARWorldTrackingConfiguration()
    configuration.detectionImages = referenceImages

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

    return arView

}

代码编译时没有任何抱怨,将其发送到电话时,AR会话已开始并且似乎可以执行任何操作。 下一步将是更改渲染器以显示检测到的图像。在SceneKit中,需要利用ARSCNViewDelegate(图像检测结果)。这就是我卡住的地方。 我尝试首先创建自己的myARView类,以获取对ARSessionDelegate的访问权限,希望能够访问didadd锚定函数。

     class MyARView : ARView, ARSessionDelegate {  

         required init(frame: CGRect) {

           super.init(frame: frame, cameraMode: ARView.CameraMode.ar, automaticallyConfigureSession: false)
           self.session.delegate = self
      }   
    }

然后我想在ARViewContainer结构中使用这个“新”类:

      let arView = MyARView(frame: .zero, cameraMode: ARView.CameraMode.ar, automaticallyConfigureSession: false)
       //old : let arView = ARView(frame: .zero, cameraMode: ARView.CameraMode.ar, automaticallyConfigureSession: false)

但是编译器抱怨“类型'ARViewContainer'不符合协议'UIViewRepresentable'。 或在声明

时出现这样的抱怨:“表达类型不明确,没有更多上下文”
        let arView = MyARView(...'  

有人知道如何正确执行此操作吗?

1 个答案:

答案 0 :(得分:0)

我想我在这里找到了有关如何“捕获”委托回调的良好灵感。 ARKit & Reality composer - how to Anchor scene using image coordinates

感谢马克D