如何使用ARKit和RealityKit检测2D图像?

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

我想使用ARKit和RealityKit检测2D图像。由于基于RealityKit的许多实现(访问Experience.rcproject),所以我不想使用SceneKit。有什么想法吗?

我尝试过此代码

import ARKit
import RealityKit


class ViewController: UIViewController, ARSessionDelegate {

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {

        guard let imageAnchor = anchors.first as? ARImageAnchor,
              let _ = imageAnchor.referenceImage.name
        else { return }

        let anchor = AnchorEntity(anchor: imageAnchor)

        // Add Model Entity to anchor
        anchor.addChild(model)

        arView.scene.anchors.append(anchor)
    }

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

        arView.session.delegate = self
        resetTrackingConfig()
    }

    func resetTrackingConfig() {

        guard let refImg = ARReferenceImage.referenceImages(inGroupNamed: "Sub",
                                                                  bundle: nil)
        else { return }

        let config = ARWorldTrackingConfiguration()
        config.detectionImages = refImg
        config.maximumNumberOfTrackedImages = 1

        let options = [ARSession.RunOptions.removeExistingAnchors,
                       ARSession.RunOptions.resetTracking]

        arView.session.run(config, options: ARSession.RunOptions(options))
    }
}

来自上一篇文章,但似乎已经过时/不完整。下面的代码适用于SceneKit,但无法从Experience.rcproject访问任何场景

import UIKit
import RealityKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
    }

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

            let configuration = ARImageTrackingConfiguration()

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

            configuration.trackingImages = trackedImages
            configuration.maximumNumberOfTrackedImages = 7

            sceneView.session.run(configuration)
        }

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        <#code#>
    }

        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: "ship.scn")!
                let shipNode = shipScene.rootNode.childNodes.first!

                shipNode.position = SCNVector3Zero
                shipNode.position.z = 0.15

                planeNode.addChildNode(shipNode)

                node.addChildNode(planeNode)
            }
            return node
        }
}
swift augmented-reality arkit realitykit arimageanchor
1个回答
0
投票
  1. 向您的项目资产添加新的“ AR资源组”,然后在其中添加标记图像。确保给它一个宽度和高度。我称这个小组为“标记”
  2. 添加我的UIViewController的以下代码(在viewWillAppear中有以下代码:]
    let imageAnchor = AnchorEntity(.image(group: "Markers", name: "YourImageName"))
    yourARView.scene.anchors.append(imageAnchor)
    // Setup some models to add etc
    imageAnchor.addChild(someModel)
© www.soinside.com 2019 - 2024. All rights reserved.