ARKit1.5介绍图像识别.在代码中,您必须创建一组参考图像,如下所示:
let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)
Run Code Online (Sandbox Code Playgroud)
然后可以识别集合中包含的图像.
我想知道是否可以动态添加图像到此AR Resources文件夹.例如,用户可以拍照并将其发送到服务器,然后由用户识别ARKit.或者用户可以根据他的位置等接收一组图像.
我有一个嵌入导航控制器的控制器,带有大标题和UIRefreshControl.当我在tableView上进行快速刷新时,活动指示器的动画非常糟糕.
我不知道我的代码中是否有不良行为?
tableView.refreshControl = UIRefreshControl()
tableView.refreshControl?.addTarget(self, action: #selector(downloadData), for: .valueChanged)
我试图证明我的UILabel文本,但它不起作用.
我的宣言UIView:
descriptionUIView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
Run Code Online (Sandbox Code Playgroud)
我的宣言UILabel:
bottleDescriptionLabel = UILabel(frame: CGRect(x: widthMargin, y: bottleDescriptionTitleLabel.frame.maxY + heightMargin, width: self.view.frame.width - (2 * widthMargin), height: heightBottleDescription - (2 * heightMargin)))
bottleDescriptionLabel.font = UIFont(name: "AvenirNext-Regular", size: 16)
bottleDescriptionLabel.text = bottleDescriptionString
bottleDescriptionLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
bottleDescriptionLabel.textAlignment = NSTextAlignment.Justified
bottleDescriptionLabel.numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:

我不知道还有什么可以NSTextAlignment.Justified用来证明我的文本.我应该用UITextView吗?
我想在我的屏幕底部有一个条形/按钮,其行为类似于Spotify上的迷你播放器栏.如果我点击它,会从底部显示一个视图.如果我拖动它,我可以玩它并让它上下移动.如果我发布它,它会自行继续.
我检查了这个问题:如何在点击歌曲时像Spotify的音乐播放器一样垂直地对象进行动画制作,但它只调整了(图像)视图的大小,我想放置一个新的ViewController(我不能拖动它,只能点击它).
我找到了一个项目:https://github.com/andriirogulin/ARSlidingPanel,看起来效果非常好.这真的是我想要达到的目标.
我的问题是我几乎不了解Objective-C.此外,我尝试遵循集成教程,我无法从ARSPContainerController添加自定义segue.我需要从一个对象拖动它,并且示例项目中没有.因此,我想知道:
我正在尝试使用图像识别的ARKit 1.5,因为我们可以从Apple的示例项目代码中读取: 初始检测后不会跟踪图像锚点,因此创建一个限制平面可视化显示持续时间的动画.
一个ARImageAnchor没有center: vector_float3喜欢的ARPlaneAnchor,我找不到如何跟踪检测到的图像锚点.
我希望在这个视频中实现类似的东西,即拥有修复图像,按钮,标签等等,保持在检测到的图像之上,我不明白我是如何实现这一点的.
这是图像检测结果的代码:
// MARK: - ARSCNViewDelegate (Image detection results)
/// - Tag: ARImageAnchor-Visualizing
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let referenceImage = imageAnchor.referenceImage
updateQueue.async {
// Create a plane to visualize the initial position of the detected image.
let plane = SCNPlane(width: referenceImage.physicalSize.width,
height: referenceImage.physicalSize.height) …Run Code Online (Sandbox Code Playgroud) 我有一个UITableViewCell与UILabel和UIImageView。图像可以是可见的或隐藏的。
的尾随部分有两个约束UILabel,一个 (a) 等于 8 与UIImageView,另一个 (b) 大于或等于 8 与单元格的右边距。我保留第一个 (a) 的引用,如果有声音或没有声音,我会激活或停用约束。
这是我的代码:
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var label: UILabel?
@IBOutlet weak var icon: UIImageView?
@IBOutlet weak var spaceBetweenIconAndLabelConstraint: NSLayoutConstraint?
override func awakeFromNib() {
super.awakeFromNib()
icon?.image = UIImage(named: "sound")
}
func config(with name: String, hasSound: Bool) {
label?.text = name
configSound(hasSound)
}
private func configSound(_ hasSound: Bool) {
icon?.isHidden = !hasSound
spaceBetweenIconAndLabelConstraint?.isActive = hasSound
}
}
Run Code Online (Sandbox Code Playgroud)
我有几个带有声音图标的单元格,很多没有。这是特定单元格首次出现时的样子: …
我正在做这个简单的事情:
图像被挂在检测到的平面上(在我的墙上)。在这两种情况下,我都实现的renderer:didAddNode:forAnchor:功能ARSCNViewDelegate。我站在垂直平面检测和图像识别的地方。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let shipScene = SCNScene(named: "ship.scn"), let shipNode = shipScene.rootNode.childNode(withName: "ship", recursively: false) else { return }
shipNode.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
sceneView.scene.rootNode.addChildNode(shipNode)
print(anchor.transform)
}
Run Code Online (Sandbox Code Playgroud)
在垂直平面检测的情况下,anchor将为ARPlaneAnchor。在图像识别的情况下,anchor将为ARImageAnchor。
为什么这两个锚点的转换矩阵如此不同?我正在打印anchor.transform并得到以下结果:
1。
simd_float4x4([
[0.941312, 0.0, -0.337538, 0.0)],
[0.336284, -0.0861278, 0.937814, 0.0)],
[-0.0290714,-0.996284, -0.0810731, 0.0)],
[0.191099, 0.172432, -1.14543, 1.0)]
])
Run Code Online (Sandbox Code Playgroud)
2。
simd_float4x4([
[0.361231, 0.10894, 0.926093, 0.0)], …Run Code Online (Sandbox Code Playgroud) 我正在渲染一个 Collada (*.dae) 文件ARKit。作为我的叠加层,我ARSCNView添加了一个SKScene只显示消息气泡(还没有文本)的。
目前,我知道如何修改气泡的位置,使其看起来总是在我的 3D 模型的脚下。我这样做:
func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
if let overlay = sceneView.overlaySKScene as? BubbleMessageScene {
guard let borisNode = sceneView.scene.rootNode.childNode(withName: "boris", recursively: true) else { return }
let boxWorldCoordinates = sceneView.scene.rootNode.convertPosition(borisNode.position, from:sceneView.scene.rootNode.parent)
let screenCoordinates = self.sceneView.projectPoint(boxWorldCoordinates)
let boxY = overlay.size.height - CGFloat(screenCoordinates.y)
overlay.bubbleNode?.position.x = CGFloat(screenCoordinates.x) - (overlay.bubbleNode?.size.width)!/2
overlay.bubbleNode?.position.y = boxY
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我的气泡总是在3D 模型的脚下,因为我只能获得我的模型的 SCNNode 位置,它被锚定在那里。我希望它位于我的模型的头部。
有什么方法可以获取我的 3D 模型的高度,然后获取其转换后的屏幕坐标,所以无论我在哪里使用手机,看起来气泡消息总是在头部旁边?