我正在尝试估算与太空中QR码相关的设备位置.我正在使用ARKit和Vision框架,两者都在iOS11中引入,但这个问题的答案可能并不依赖于它们.
使用Vision框架,我能够获得在相机框架中限制QR码的矩形.我想将此矩形与从标准位置转换QR码所需的设备平移和旋转相匹配.
例如,如果我观察到框架:
* *
B
C
A
D
* *
Run Code Online (Sandbox Code Playgroud)
如果我距离QR码1米远,以它为中心,假设QR码的边长为10cm,我会看到:
* *
A0 B0
D0 C0
* *
Run Code Online (Sandbox Code Playgroud)
那两个帧之间的设备转换是什么?我知道确切的结果可能是不可能的,因为观察到的QR码可能是略微非平面的,我们试图估计一个不完美的东西上的仿射变换.
我想这sceneView.pointOfView?.camera?.projectionTransform比sceneView.pointOfView?.camera?.projectionTransform?.camera.projectionMatrix后者已经考虑了从ARKit推断的变换更有帮助我对此问题不感兴趣.
我该怎么做
func get transform(
qrCodeRectangle: VNBarcodeObservation,
cameraTransform: SCNMatrix4) {
// qrCodeRectangle.topLeft etc is the position in [0, 1] * [0, 1] of A0
// expected real world position of the QR code in a referential coordinate system
let a0 = SCNVector3(x: -0.05, y: 0.05, z: 1)
let b0 = SCNVector3(x: 0.05, y: 0.05, z: …Run Code Online (Sandbox Code Playgroud) 我很想知道,每个基于视觉的移动增强现实框架的优缺点在哪里?在哪种情况下应该决定什么?你会选择Vuforia,因为它是免费的,没有品牌吗?其中一个框架缺少哪些重要功能?免费版Metaio SDK(品牌和Metaio启动画面除外)是否有限制?
我认为这些是支持iOS和Android的最重要的框架.我知道metaio支持电影纹理和MD2(动画)导出和Vuforia没有(至少不在基本状态).
编辑:
这是一个3小时的会议,回顾了市场上最好的Mobile AR SDK以及如何开始使用它们:教程:面向开发人员的十大增强现实SDK
您还应该从增强现实实验室SL中查看ARLab.它具有用于AR浏览器,图像匹配,图像跟踪,3D引擎,虚拟按钮的不同AR-SDK.但这不是免费的.
Wikitude的ARchitect SDK具有Vuforia-Extension和Blackberry 10支持.这也可能非常有趣.
该拉亚SDK现在可用于iOS和Android的3D,动画,视频AR和QR码扫描仪
DARAM也是适用于Android,iOS,Windows 8和Mac的优秀SDK.
ARPA有Unity-Plugin和Google Glass SDK.
这是增强现实SDK和框架的良好比较图表
Apple收购了Metaio.Metaio的未来不确定.(2015年5月28日)
Magic Leap宣布推出面向虚幻和Unity的增强现实开发者SDK
Vuforia现在已经支付了许可和演示应用程序的能力而没有免费的Starter计划的水印 - 它现在只出现在特定日期的第一个应用程序启动期间.这是为了支持想要在不显示水印的情况下向客户进行演示的开发人员.(2015年5月6日),Qualcomm将其Vuforia业务出售给PTC(2015年10月12日)
ARKit iOS 11引入了ARKit,这是一个新的框架,可让您轻松为iPhone和iPad创建无与伦比的增强现实体验.通过将数字对象和信息与您周围的环境相结合,ARKit将应用程序带到了屏幕之外,使他们能够以全新的方式与现实世界进行交互.(Juni 2017)
8th Wall XR是世界上第一个适用于所有常用iOS和Android手机的AR平台,可与ARKit和ARCore无缝集成.(2017年8月)
ARCore是谷歌对Apple的ARKit的回答.它旨在以相对简单的方式为所有Android手机带来增强现实功能.它还取代了Project Tango,后者需要专门的硬件才能运行.
如何实现垂直平面检测(即墙壁)?
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
Run Code Online (Sandbox Code Playgroud) 看着苹果样品AR应用程序,有许多逼真的物体(杯子,蜡烛等).但是,使用Xcode上的场景工具包编辑器很明显,这只允许您创建基本对象.
我的问题是,什么软件/文件可用于创建逼真的scn对象?我确信有一些软件可以让你创建3D模型并将它们转换为scn文件.我只是不知道使用哪个软件或可以转换为哪些文件scn
注意:我知道Stackoverflow指南对于这个问题可能过于模糊/宽泛.我只是不知道在哪里提出我的问题,这似乎是最好的地方
在ARKit中,我发现了两种在hitTest之后插入节点的方法
插入ARAnchor然后在渲染器中创建节点(_ renderer:SCNSceneRenderer,nodeFor anchor:ARAnchor) - > SCNNode?
let anchor = ARAnchor(transform:hit.worldTransform)
sceneView.session.add(anchor:anchor)
Run Code Online (Sandbox Code Playgroud)直接插入节点
node.position = SCNVector3(hit.worldTransform.columns.3.x, hit.worldTransform.columns.3.y, hit.worldTransform.columns.3.z)
sceneView.scene.rootNode.addChildNode(node)
Run Code Online (Sandbox Code Playgroud)两者都看起来适合我,但为什么这样或那样?
主要问题:
我在此之后添加此部分以澄清问题. - 我可以暂停我的视频(我不希望它在循环播放).当我的节点出现时,我的节点播放我的视频,即使它处于暂停状态.如果我的视频播放完毕,它就会出现,它会重新启动.我想删除此行为.
在我的应用程序中,我使用对象和对象SKVideoNode从AVPlayer(:URL)内部3D空间创建.我用来确定何时找到特定图像,并从那里播放视频.一切都很好,花花公子,除了每次AVPlayer进入视线时玩家决定按照自己的时间进行游戏; 但是,它可能是只要在连接到进入视野.无论哪种方式,每次节点进入相机镜头时都会播放.我用SCNNodeSCNGeometryARKit .ImageTrackingARImageAnchorSCNNodeAVPlayer
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if(keyPath == "rate") {
print((object as! AVPlayer).rate)
}
}
Run Code Online (Sandbox Code Playgroud)
打印出速率,它是1,但它是0.
我print("Play")使用player.pause()或player.play()为我的所有函数打印出某种打印函数,并且无论何时更改速率,都不会调用它们.如何找到改变播放器速率的来源?
我检查了原始的rootnode,self.sceneview.scene.rootNode.childNodes以确保我没有创建额外的VideoNodes/SCNNodes/AVPlayers等,似乎只有1.
关于为什么SKVideoNode/AVPlayer正在作为SCNNode播放的任何想法都会使用ARKit看到相机?提前致谢!
EDIT1:
制定了一种解决方法,仅在用户单击此节点时确定
let tap = UITapGestureRecognizer(target: self, action: #selector(self!.tapGesture))
tap.delegate = self!
tap.name = "MyTap"
self!.sceneView.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)
然后在下一个函数里面,我放了
@objc func tapGesture(_ gesture:UITapGestureRecognizer) {
let tappedNodes = self.sceneView.hitTest(gesture.location(in: gesture.view), options: [SCNHitTestOption.searchMode: 1])
if …Run Code Online (Sandbox Code Playgroud) 我正在创建一个 iOS 应用程序,我打算在 AR 中显示逼真/高质量的渲染。在试验这 3 个选项的同时,我仍然不确定我应该继续开发我的应用程序框架中的哪一个:SceneKit、RealityKit和Metal。
我读过 SceneKit 是建立在 Metal 之上的,但我不确定是否值得花时间/精力对任何自定义着色器进行编程,而不是使用 SceneKit 默认提供的功能。关于 RealityKit,我不需要它提供的任何动画或特殊效果,只需要照片级渲染方面。
三者中哪一个最适合开发 AR 和高质量模型渲染?
我正在同时学习ARKit和Scenekit,这是一个挑战.
创建了ARWorldTrackingSessionConfiguration会话后,我想知道是否有人知道在场景会话中获取用户"相机"位置的方法.我的想法是想要将对象设置为用户当前位置的动画.
let reaperScene = SCNScene(named: "reaper.dae")!
let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)!
reaperNode.position = SCNVector3Make(0, 0, -1)
let scene = SCNScene()
scene.rootNode.addChildNode(reaperNode)
// some unknown amount of time later
let currentCameraPosition = sceneView.pointOfView?.position
let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0)
reaperNode.runAction(moveAction)
Run Code Online (Sandbox Code Playgroud)
但是,即使我正在移动相机,似乎currentCameraPosition总是[0,0,0].知道我做错了什么吗?最终的想法是我会旋转对象围绕一个看不见的球体,直到它在镜头前,然后动画它,做一些与此类似:旋转SCNCamera节点看着周围的假想球体的对象(这种方式,用户看到对象动画的对象)
谢谢你的帮助.
如何使用ARKit跟踪的水平和垂直平面隐藏墙后/真实物体后面的物体?目前,当你离开房间和/或它们应该在后面的物体前面时,可以通过墙看到3D添加的物体.那么有可能使用ARKit让我提供更自然的AR体验而不会通过墙壁出现这些对象吗?
如果有的话,将Apple的新ARKit用于多个用户/设备的最佳方式是什么?
似乎每个设备都有自己独立的场景理解.到目前为止,我最好的猜测是使用原始特征点位置并尝试在不同设备上匹配它们以将不同的视点粘合在一起,因为ARKit不提供任何绝对参考参考.
=== Edit1,我尝试过的东西===
1)特征点
我已经玩过暴露的原始特征点,我现在确信在他们目前的状态下他们是死路一条:
总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,不能在一个设备中进行任何类型的好点匹配,更不用说几个.替代方案是实现我自己的特征点检测和匹配,但这将更多地取代ARKit而不是利用它.
2)QR码
正如@Rickster建议的那样,我也尝试识别一个容易识别的对象,如QR码,并从该固定点获得相对参考变化(请参阅此问题)这有点困难,并暗示我使用一些openCV来估计相机姿势.但更重要的是非常有限
arkit ×10
swift ×7
ios ×5
scenekit ×5
ios11 ×2
android ×1
arcore ×1
avplayer ×1
camera ×1
ios12 ×1
metal ×1
multiplayer ×1
realitykit ×1
scnnode ×1
skvideonode ×1