之前我使用vuforia(unity)开发了适用于iOS的AR应用程序。现在我必须使用ARKit实现相同的应用程序。
除了没有标记检测外, ARKit
很棒。
到目前为止,我已经尝试使用视觉来检测标记并且没有成功。 我可以在标记检测中使用一些样本并在iOS标记上显示三维模型吗?
先谢谢。
答案 0 :(得分:0)
有很多方法可以实现您的目标,尽管可以说最简单的是使用图像是标记。
从ARKit
1.5开始,您可以使用ReferenceImages
放置与您在Vuforia
或EasyAR
中使用的标记基本相同的AR内容。< / p>
对于您的信息,referenceImage
只是:
在a。期间在现实世界环境中识别的图像 世界跟踪AR会话。
要使用此功能,您需要传入:
将参考图像收集到您的会话配置中 detectionImages属性。
可以这样设置:
var detectionImages: Set<ARReferenceImage>! { get set }
ARKit 1.5
需要注意的一点是,Vuforia
与extended tracking
不同,可以允许SampleCode
张图片:
图像检测并不能连续跟踪现实世界的运动 图像从视图中消失时的图像或轨迹。图像检测 最适用于AR内容响应静态图像的情况 场景 - 例如,识别博物馆中的艺术品或添加动画 电影海报的元素。
正如@Alexander所说,了解这可能适合您的情况的最佳选择是在线查看Documentation
和ARReferenceImage
,可在此处找到:
Recognizing Images In An AR Experience
然而,核心要点是:
启用图像检测:
您需要先提供一个或多个AR
资源。这些可以使用Xcode
中的ARKit
资产目录手动添加,记住您必须尽可能准确地输入Xcode中图像的物理大小,因为ARReferenceImages
依赖于此信息来确定图像与相机的距离。
init(CGImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
也可以使用以下方法动态创建:
init(CVPixelBuffer, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
从Core Graphics图像创建新的参考图像 对象
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之前传入ARReferenceImages,例如:
ARReferenceImage
处理图像检测:
当ARSession
检测到ARImageAnchor
并创建了ARSCNViewDelegate
时,会提供:
有关检测到的图像的位置和方向的信息 世界跟踪AR会话。
如果图像检测成功,则需要使用以下func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { }
回调来处理对象的放置等:
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)
}
使用它来处理3D内容的位置的示例如下:
const NAMEURL = "https://uzby.com/api.php"
// get data from api
function getDataFromApi(value, callback){
const QUERY = {
min:`${value}`,
max:`${value}`
}
$.getJSON(NAMEURL, QUERY, callback)
}
function renderResult(result){
return `${result}`;
}
// render results to page
function displayName(data){
console.log(data);
const results = renderResult(data);
$('.nameResult').html(results);
}
// wait for user to submit
function watchSubmit() {
$('.js-search-form').submit(event => {
event.preventDefault();
const queryTarget = $(event.currentTarget).find('#js-dropValue');
const thisquery = queryTarget.val();
getDataFromApi(thisquery, displayName);
});
}
// running the watch submit function waiting for click
$(watchSubmit);
希望它有所帮助...