SceneKit и ImageTraking в SwiftUI - PullRequest
       39

SceneKit и ImageTraking в SwiftUI

0 голосов
/ 10 октября 2019

У меня есть приложение с SwiftUI, и я хотел бы добавить в него ImageTracking с ArKit 2. Для этого я создал второй проект приложения. Это приложение дополненной реальности с этой опцией: project_option . После того, как я создаю отслеживание изображений, и это работает, как вы можете видеть: Представление AR с кодом приложения полностью кодируется с помощью UIkit .

Я скопировал, viewController, Main.StoryBoard, папка art.scnasset и папка AR_ressources.

Это мой ViewController.

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
            super.viewDidLoad()

            // Set the view's delegate
            sceneView.delegate = self

            // Create a new scene
            let scene = SCNScene(named: "art.scnassets/GameScene.scn")!

            // Set the scene to the view
            sceneView.scene = scene

        }

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)

            // Create a session configuration
            let configuration = ARImageTrackingConfiguration()

            guard let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "Photos", bundle: Bundle.main) else {
                print("No images available")
                return
            }

            configuration.trackingImages = trackedImages
            configuration.maximumNumberOfTrackedImages = 1

            // Run the view's session
            sceneView.session.run(configuration)
        }

        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)

            // Pause the view's session
            sceneView.session.pause()
        }


        // MARK: - ARSCNViewDelegate

        func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

            let node = SCNNode()

            if let imageAnchor = anchor as? ARImageAnchor {
                let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)

                plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.8)

                let planeNode = SCNNode(geometry: plane)
                planeNode.eulerAngles.x = -.pi / 2


                let shipScene = SCNScene(named: "art.scnassets/ship.scn")!
                let shipNode = shipScene.rootNode.childNodes.first!
                shipNode.position = SCNVector3Zero
                shipNode.position.z = 0.15

                planeNode.addChildNode(shipNode)


                node.addChildNode(planeNode)

            }

            return node

        }



    }

После того, как я создал файл SwiftUI для встраивания его, и это мой файл:

import SwiftUI

struct ARKitView : UIViewRepresentable {

    func makeUIView(context: Context) -> UIView {
        return UIStoryboard(name: "Main", bundle: Bundle.main).instantiateInitialViewController()!.view
    }

    func updateUIView(_ view: UIView, context: Context) {

    }
}

#if DEBUG
struct ARKitView_Previews : PreviewProvider {
    static var previews: some View {
        ARKitView()
    }
}
#endif

Сразу после этого я ввел его во второй файл SwiftUI, чтобы показать его иэто мой файл:

import SwiftUI

struct SwiftUIView: View {

    var onDismiss: () -> ()

    var body: some View {
                ZStack{
                   ARKitView()
                        .edgesIgnoringSafeArea(.all)
                    VStack{
                        HStack{
                            Button(action: { self.onDismiss() }) {
                                Image(systemName: "xmark.circle.fill")
                                    .font(.title)
                                    .foregroundColor(.white)
                                .padding()

                            }
                            Spacer()
                            }
                        Spacer()

                            Button(action: {}) {
                                Circle()
                                    .stroke(Color.white, lineWidth: 5)
                                    .frame(width: 75, height: 75)
                            }
                        .padding()
                        }

            }
        }
    }

Это то же самое, что и первое приложение, но встраивается в файл SwiftUI, но на самом деле он не работает. У меня есть камера для AR, но когда я указываю на нее изображение, отслеживание изображений не работает.

Представление AR с кодом приложения с помощью SwiftUI

И я хотел бы получить результат кода приложения с UIkit в коде приложения с SwiftUI и UIkit, ноЯ не знаю, как я могу это сделать. Я думаю, что ошибка в ARKitView: UIViewRepresentable. Представление AR на самом деле не встроено в мой файл swiftui, но я не знаю, как это сделать.

Спасибо за вашу помощь.

...