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

Swift 如何使用ARKit和RealityKit检测2D图像?,swift,augmented-reality,arkit,realitykit,arimageanchor,Swift,Augmented Reality,Arkit,Realitykit,Arimageanchor,我想用ARKit和RealityKit检测2D图像。我不想使用SceneKit,因为许多实现都是基于RealityKit(accesstoexperience.rcproject)的。有什么想法吗 我试过这个密码 import ARKit import RealityKit class ViewController: UIViewController, ARSessionDelegate { func session(_ session: ARSession, didUpdate

我想用ARKit和RealityKit检测2D图像。我不想使用SceneKit,因为许多实现都是基于RealityKit(accesstoexperience.rcproject)的。有什么想法吗

我试过这个密码

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
        }
}
导入UIKit
进口商品
导入SceneKit
进口阿基特
类ViewController:UIViewController、ARSCNViewDelegate{
@IBVAR场景视图:ARSCNView!
重写func viewDidLoad(){
super.viewDidLoad()
sceneView.delegate=self
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
let configuration=ARImageTrackingConfiguration()
guard let TrackeImage=ARReferenceImage.ReferenceImage(InGroupName:“照片”,bundle:bundle.main)else{
打印(“无可用图像”)
返回
}
configuration.trackingImages=trackedImages
configuration.maximumNumberOfTrackedImages=7
sceneView.session.run(配置)
}
func渲染器(渲染器:SCNSceneRenderer,diddad节点:SCNNode,用于锚点:ARAnchor){
}
func渲染器(u渲染器:SCNSceneRenderer,锚点的节点:ARAnchor)->SCNNode{
let node=SCNNode()
如果让imageAnchor=锚定为?ARImageAnchor{
让平面=SCNPlane(宽度:imageAnchor.referenceImage.physicalSize.width,高度:imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents=UIColor(白色:1,alpha:0.8)
设planeNode=SCNNode(几何图形:平面)
planeNode.eulerAngles.x=-.pi/2
让shipScene=SCNScene(命名为:“ship.scn”)!
让shipNode=shipsecene.rootNode.childNodes.first!
shipNode.position=SCInvector3Zero
shipNode.position.z=0.15
planeNode.addChildNode(shipNode)
node.addChildNode(平面节点)
}
返回节点
}
}
  • 将新的“AR资源组”添加到项目资产中,并在其中添加标记图像。一定要给它一个宽度和高度。我称这个小组为“标记”
  • 添加我的UIViewController的以下代码(我在视图中将显示):
  • 让imageAnchor=AnchoreEntity(.image(组:“标记”,名称:“YourImageName”))
    yourARView.scene.anchors.append(imageAnchor)
    //设置一些要添加的模型等
    imageAnchor.addChild(someModel)
    
    除了将参考图像包含在捆绑包中之外,还可以在运行时添加图像,如果您愿意的话,也可以这样做:

    a。设置字典以帮助将图像与锚关联:

    private var imageAnchorToEntity: [ARImageAnchor: AnchorEntity] = [:]
    
    b。在
    viewDidLoad()
    或您选择的任何其他位置设置参考图像:

    let exampleImage = ARReferenceImage(UIImage(named: "example"), orientation: .up, physicalWidth: 0.2)
    let set = Set<ARReferenceImage>()
    set.insert(exampleImage) 
    let config = ARImageTrackingConfiguration()
    config.trackingImages = set
    
    d。相应地,您可以通过访问字典,在会话(uu:didUpdate:)委托方法中获得对您的AnchoreEntity及其子对象的引用:

    func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        anchors.compactMap { $0 as? ARImageAnchor }.forEach {
            let anchorEntity = AnchorEntity(anchor: $0)
            // Add other entities as children to your AnchorEntity
            anchorEntity.addChild(yourEntity)
            imageAnchorToEntity[$0] = anchorEntity // Setting the reference
            arView.scene.addAnchor(anchorEntity)
    }
    
    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        anchors.compactMap { $0 as? ARImageAnchor }.forEach {
            let anchorEntity = imageAnchorToEntity[$0]
            anchorEntity?.transform.matrix = $0.transform
        }
    }
    
    注意:在本例中,我使用了
    ARImageTrackingConfiguration
    ,它主要用于跟踪图像。它也可以在
    arworldctrackingconfiguration
    上工作,但当用户移动设备时,它可能无法跟踪您的图像