首先你需要考虑的是你是否想使用
ARWorldTrackingConfiguration
或
ARImageTrackingConfiguration
(
IOS12
)中。
如果你使用
图像跟踪配置
,无法使用平面检测,因为这是仅图像跟踪配置:
它允许您将虚拟内容锚定到已知的图像,仅当
图像在摄像机的视野中。基于图像检测的世界跟踪
允许您使用已知图像将虚拟内容添加到三维世界,以及
继续跟踪该内容在世界空间中的位置
在图像不再显示之后。
如果您希望您的内容始终固定在图像上(当您看到相机时),这将是您的最佳选择,因为:
它以6个自由度(6个自由度)跟踪它们的运动:
具体来说,三个旋转轴(滚动、俯仰和偏航)和
三个平移轴(X、Y和Z方向的移动)。
另一方面如果你想发现
ARPlaneAnchors
,以及
ARImageAnchors
,但不必担心与
ARImageAnchor
不会一直跟踪你应该用
arworld跟踪配置
是的。
正如@trinca还说的,你需要确保你为你的图像提供的测量值尽可能精确。
ARKit
使用这些返回
physicalSize
和
physicalWidth
使虚拟内容能够更准确地放置的图像(例如,如果您指定的图像大小大于现实生活中图像的实际大小,则无法准确对齐虚拟内容)。
创建名片或任何ImageTarget时,我们必须确保在
ARReferenceImage Settings
盒子:
我们可以检查一下
imageTarget
检测结果如下:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let validImageAnchor = anchor as? ARImageAnchor,
let targetName = validImageAnchor.referenceImage.name, targetName == "TargetCard" else { return}
let businessCardWidth = validImageAnchor.referenceImage.physicalSize.width
let businessCardHeight = validImageAnchor.referenceImage.physicalSize.height
print(
"""
We Have Detected Business Card With Name \(targetName)
\(targetName)'s Width Is \(businessCardWidth)
\(targetName)'s Height Is \(businessCardHeight)
""")
}
在检查了我们检测到的大小是否准确之后,我们就可以放置与此相关的任何内容。
与其按程序来做每件事,更容易达到你想要的结果的方法是创建一个
SCNScene
是的。
更新:
正如您所要求的一个示例项目,我已经为每个人创建了一个完全工作的示例,可以在这里下载:
ARKit Business Card
没有经历每一个
Class
我将详细地向您提供基本的细节。
我们将使用
scnscene公司
作为一个可重用的模板,它包含
SCNNode
它们用作按钮,按下按钮时可以执行不同的操作。
基本模板如下所示:
businesscard节点初始化为businesscarddata结构,如下所示:
typealias SocialLinkData = (link: String, type: SocialLink)
struct BusinessCardData{
var firstName: String
var surname: String
var position: String
var company: String
var address: BusinessAddress
var website: SocialLinkData
var phoneNumber: String
var email: String
var stackOverflowAccount: SocialLinkData
var githubAccount: SocialLinkData
}
struct BusinessAddress{
var street: String
var city: String
var state: String
var postalCode: String
var coordinates: (latittude: Double, longtitude: Double)
}
enum SocialLink: String{
case Website
case StackOverFlow
case GitHub
}
所有提供的数据都映射到
scnnode公司
并帮助执行必要的功能。
通过使用
struct
我们可以创建多个交互式名片,例如:
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let referenceImage = imageAnchor.referenceImage
if let matchedBusinessCardName = referenceImage.name, matchedBusinessCardName == "BlackMirrorz"{
let businessCardData = BusinessCardData(firstName: "Josh",
surname: "Robbins",
position: "Software Engineer",
company: "BlackMirrorz",
address: BusinessAddress(street: "1 Infinite Loop",
city: "Cupertino",
state: "CA",
postalCode: "95015",
coordinates: (latittude: 37.3349, longtitude: -122.0090201)),
website: SocialLinkData(link: "https://www.blackmirrorz.tech", type: .Website),
phoneNumber: "+821076337633",
email: "josh.robbins@blackmirroz.tech",
stackOverflowAccount: SocialLinkData(link: "https://stackoverflow.com/users/8816868/josh-robbins", type: .StackOverFlow),
githubAccount: SocialLinkData(link: "https://github.com/BlackMirrorz", type: .GitHub))
let businessCard = BusinessCard(data: businessCardData, cardType: .noProfileImage)
businessCardPlaced = true
node.addChildNode(businessCard)
}
}
}
因为设计已经布置好了,我们不需要做任何复杂的计算。一切都是为了我们!
用户使用以下图标进行交互:
-
这个
StackOverFlow Button
呈现滑出
WKWebView
显示用户
StackOverFlow
帐户。
-
这个
GitHub Button
呈现滑出
wkwebview网站
显示用户
GitHub
帐户。
-
这个
Internet Button
呈现滑出
wkwebview网站
显示用户网站。
-
这个
Phone Button
允许用户拨打业务电话号码。
-
这个
SMS Button
呈现一个
MFMessageComposeViewController
允许用户向企业发送文本消息。
-
这个
Email Button
呈现一个
MFMailComposeViewController
允许用户通过电子邮件发送业务。
-
这个
Contact Button
创建
CNMutableContact
并将业务另存为用户设备上的新联系人。
-
这个
Location Button
呈现滑出
MKMapView
显示用户的业务位置。
自从呈现一个
wkwebview网站
作为
SCNMaterial
,我不得不考虑其他方法来让内容完全交互。
因此,我利用了这个神奇的仓库
SideMenu
通过
Jonkykong
这里有:
SideMenu
这允许用户仍然体验
雅克特
同时允许几乎分裂的屏幕效果:
一如既往,希望它能帮助你和其他对学习雅克特感兴趣的人…