如果有的话,将Apple的新ARKit用于多个用户/设备的最佳方式是什么?
似乎每个设备都有自己独立的场景理解.到目前为止,我最好的猜测是使用原始特征点位置并尝试在不同设备上匹配它们以将不同的视点粘合在一起,因为ARKit不提供任何绝对参考参考.
=== Edit1,我尝试过的东西===
1)特征点
我已经玩过暴露的原始特征点,我现在确信在他们目前的状态下他们是死路一条:
总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,不能在一个设备中进行任何类型的好点匹配,更不用说几个.替代方案是实现我自己的特征点检测和匹配,但这将更多地取代ARKit而不是利用它.
2)QR码
正如@Rickster建议的那样,我也尝试识别一个容易识别的对象,如QR码,并从该固定点获得相对参考变化(请参阅此问题)这有点困难,并暗示我使用一些openCV来估计相机姿势.但更重要的是非常有限
我正在使用ARKit(使用SceneKit)添加虚拟对象(例如球).我通过使用Vision框架并在视觉请求完成处理程序方法中接收其更新位置来跟踪真实世界对象(例如,脚).
let request = VNTrackObjectRequest(detectedObjectObservation: lastObservation, completionHandler: self.handleVisionRequestUpdate)
Run Code Online (Sandbox Code Playgroud)
我想用虚拟替换跟踪的现实世界对象(例如用立方体替换脚)但是我不知道如何将边界框矩形(我们在视觉请求完成中接收)替换为场景套件节点,因为坐标系统是不同的.
以下是视觉请求完成处理程序的代码:
private func handleVisionRequestUpdate(_ request: VNRequest, error: Error?) {
// Dispatch to the main queue because we are touching non-atomic, non-thread safe properties of the view controller
DispatchQueue.main.async {
// make sure we have an actual result
guard let newObservation = request.results?.first as? VNDetectedObjectObservation else { return }
// prepare for next loop
self.lastObservation = newObservation
// check the confidence level before updating the UI
guard newObservation.confidence >= 0.3 else { …Run Code Online (Sandbox Code Playgroud) 我实际上是想用QRKode将3D对象放在QRCode上 为此我使用AVCaptureDevice来检测QRCode并建立QRCode的区域,它给我一个CGRect.然后,我在CGRect的每个点上进行一次hitTest来获得平均3D坐标,如下所示:
positionGiven = SCNVector3(0, 0, 0)
for column in Int(qrZone.origin.x)...2*Int(qrZone.origin.x + qrZone.width) {
for row in Int(qrZone.origin.y)...2*Int(qrZone.origin.y + qrZone.height) {
for result in sceneView.hitTest(CGPoint(x: CGFloat(column)/2,y:CGFloat(row)/2), types: [.existingPlaneUsingExtent,.featurePoint]) {
positionGiven.x+=result.worldTransform.columns.3.x
positionGiven.y+=result.worldTransform.columns.3.y
positionGiven.z+=result.worldTransform.columns.3.z
cpts += 1
}
}
}
positionGiven.x=positionGiven.x/cpts
positionGiven.y=positionGiven.y/cpts
positionGiven.z=positionGiven.z/cpts
Run Code Online (Sandbox Code Playgroud)
但是hitTest没有检测到任何结果并冻结相机,而当我通过屏幕上的触摸进行hitTest时它可以工作.你知道它为什么不起作用吗?你有其他想法可以帮助我实现我想做的事吗?
我已经考虑过使用CoreMotion进行3D翻译,它可以让我倾斜设备,但这看起来真的很乏味.我也听说过可以锁定场景坐标以匹配相机方向的ARWorldAlignmentCamera,但我不知道如何使用它!
编辑:我每次触摸屏幕时尝试移动我的3D对象并且hitTest为正,并且它非常准确!我真的不明白为什么像素区域上的hitTest不起作用...
编辑2:以下是在屏幕上使用2-5次触摸的hitTest的代码:
@objc func touch(sender : UITapGestureRecognizer) {
for result in sceneView.hitTest(CGPoint(x: sender.location(in: view).x,y: sender.location(in: view).y), types: [.existingPlaneUsingExtent,.featurePoint]) {
//Pop up …Run Code Online (Sandbox Code Playgroud) 我看到跑的人ARKit有ARSCNView,而且他们能够获取说,在相机QRCode的矩形,并呈现在某种程度上与QR码在空间居住的地方位置的东西.我认为他们是通过委托来完成的AVCaptureMetadataOutputObjectsDelegate,所以我继续尝试实现以下逻辑:
1-运行ARSCNViewDelegate,ARSessionDelegate并AVCaptureMetadataOutputObjectsDelegate在同一时间.
2-连接ARSCNView,将视图及其会话委派给自己.
3-连接AVCaptureSession,委托自己,并开始会话.
4-开始ARSCNView会话,因为官方的例子就是这样viewWillAppear()做的,我做了同样的事情.
该应用程序并没有任何错误运行,但我只得到了一些回调的AVCaptureMetadataOutputObjectsDelegate,像3到5,然后它永远不会被再次调用像ARSession的代表查获其权威性,是我实施了错误的方法,或者你可以委托ARSession和AVCaptureSession同时?
arkit ×4
ios11 ×3
swift ×3
avfoundation ×2
3d ×1
core-motion ×1
coreml ×1
ios ×1
multiplayer ×1
qr-code ×1