如何获得跟踪图像的名称在Swift与RealityKit?



我有多个AR参考图像,我想知道我目前正在跟踪哪一个。我该怎么做呢?下面是我的代码:

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
sceneView.session.run(configuration)

您将需要使用renderer(_:didAdd:for:)方法。当你的应用程序检测到它识别的图像时,它会添加一个锚。您可以从您的资产目录中提取该图像的名称。

将此添加到您的ARSCNViewDelegate类:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let image = imageAnchor.referenceImage
// this is one means of getting the name of the image
if let trackedImage = image.name {
print(trackedImage)
}
}

如果您需要RealityKit的解决方案,而不是SceneKit的解决方案,请使用以下代码:

import ARKit
import RealityKit
extension ViewController: ARSessionDelegate {

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

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

let entity = ModelEntity(mesh: .generateSphere(radius: 0.05))
let anchor = AnchorEntity(anchor: imageAnchor)

anchor.addChild(entity)
arView.scene.anchors.append(anchor)
}
}

不要忘记实现session delegate:

class ViewController: UIViewController {
@IBOutlet var arView: ARView!

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

最新更新