之前,我使用vuforia(unity)为iOS开发了一个AR应用程序。现在,我必须使用ARKit实现相同的应用程序。
除了没有标记检测之外,ARKit
非常棒。
我已经尝试使用视觉来检测标记,但到目前为止还没有成功。我可以有一些样本用于标记检测和在iOS的标记上显示3d模型吗?
提前谢谢。
发布于 2018-06-06 07:19:16
有许多方法可以实现你正在寻找的东西,尽管可以说最简单的方法是使用图像作为标记。
从ARKit
1.5开始,您可以使用ReferenceImages
放置AR内容,这些内容本质上与您在Vuforia
或EasyAR
中使用的标记相同。
对于您的信息,referenceImage
是简单的:
要在世界跟踪AR会话期间在真实环境中识别的图像。
要使用此函数,您需要传入一个:
会话配置的detectionImages属性的引用图像的
集合。
它可以像这样设置:
var detectionImages: Set<ARReferenceImage>! { get set }
使用ARKit 1.5
需要注意的重要一点是,与Vuforia
不同的是,它允许对图像执行extended tracking
操作:
图像检测不会连续跟踪图像的真实运动,也不会跟踪图像从视图中消失的时间。图像检测最适用于AR内容响应场景中的静态图像的情况-例如,识别博物馆中的艺术或向电影海报添加动画元素。
正如@Alexander所说,要了解这如何适合您的情况,最好的办法是查看SampleCode
和Documentation
online,可在此处获得:
Recognizing Images In An AR Experience
然而,核心要点是:
启用图像检测的:
您需要首先提供一个或多个ARReferenceImage
资源。可以使用Xcode
中的AR
资源目录手动添加这些大小,请记住,您必须在Xcode中尽可能准确地输入图像的物理大小,因为ARKit
依赖此信息来确定图像与相机的距离。
还可以使用以下方法动态创建ARReferenceImages
:
init(CGImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
,它从核心图形图像对象创建新的参考图像。
init(CVPixelBuffer, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
,它从核心视频像素缓冲区创建新的参考图像。
完成此操作后,您需要创建一个world tracking配置,在运行ARSession之前传入ARReferenceImages。例如:
guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return }
let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = referenceImages
session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
图像的处理检测:
当您的ARSession
检测到ARReferenceImage
并创建ARImageAnchor
时,它只是提供:
有关在世界跟踪AR会话中检测到的图像的位置和方向的信息。
因此,如果图像检测成功,您将需要使用以下ARSCNViewDelegate
回调来处理对象的放置等:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { }
使用它处理3D内容放置的示例如下所示:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
//2. Get The Targets Name
let name = currentImageAnchor.referenceImage.name!
//3. Get The Targets Width & Height
let width = currentImageAnchor.referenceImage.physicalSize.width
let height = currentImageAnchor.referenceImage.physicalSize.height
//4. Log The Reference Images Information
print("""
Image Name = \(name)
Image Width = \(width)
Image Height = \(height)
""")
//5. Create A Plane Geometry To Cover The ARImageAnchor
let planeNode = SCNNode()
let planeGeometry = SCNPlane(width: width, height: height)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
planeNode.opacity = 0.25
planeNode.geometry = planeGeometry
//6. Rotate The PlaneNode To Horizontal
planeNode.eulerAngles.x = -.pi/2
//7. The Node Is Centered In The Anchor (0,0,0)
node.addChildNode(planeNode)
//8. Create AN SCNBox
let boxNode = SCNNode()
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
//9. Create A Different Colour For Each Face
let faceColours = [UIColor.red, UIColor.green, UIColor.blue, UIColor.cyan, UIColor.yellow, UIColor.gray]
var faceMaterials = [SCNMaterial]()
//10. Apply It To Each Face
for face in 0 ..< 5{
let material = SCNMaterial()
material.diffuse.contents = faceColours[face]
faceMaterials.append(material)
}
boxGeometry.materials = faceMaterials
boxNode.geometry = boxGeometry
//11. Set The Boxes Position To Be Placed On The Plane (node.x + box.height)
boxNode.position = SCNVector3(0 , 0.05, 0)
//12. Add The Box To The Node
node.addChildNode(boxNode)
}
希望这能帮上忙。
https://stackoverflow.com/questions/46768493
复制相似问题