У меня есть приложение с 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, но я не знаю, как это сделать.
Спасибо за вашу помощь.