Swift 如何使用ARKit和RealityKit检测2D图像?
我想用ARKit和RealityKit检测2D图像。我不想使用SceneKit,因为许多实现都是基于RealityKit(accesstoexperience.rcproject)的。有什么想法吗 我试过这个密码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
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(平面节点)
}
返回节点
}
}
让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
上工作,但当用户移动设备时,它可能无法跟踪您的图像