我是开发IOS应用程序的新手,我刚刚开始从Github构建一些示例Arkit应用程序。
我试过的一件事是来自这个链接:https://github.com/ttaulli/MeasureAR
这主要测量两点之间的距离。当我在我的iPhone中启动这个应用程序时,我可以看到点云(对象的3D点集合,我想测量它)。 我无法理解的是,为什么选择的两个测量点不是来自点云?
我还想知道以下事项:
1)针对arkit测量应用程序的点云的确切目的是什么?
2)点云密度是否取决于对象的颜色(应用程序基本上在实时摄像机上运行)。是否还有其他因素影响这一点云?
我也很高兴,如果有人可以提供任何其他样品Arkit测量应用程序,它要求用户从pointcloud中选择两个点。
提前致谢!
答案 0 :(得分:1)
您所指的pointCloud
实际上是ARSCNDebugOptions
的一部分:
绘制叠加内容的选项,以帮助调试AR跟踪 一个SceneKit视图。
您可以这样设置:ARSCNDebugOptions.showFeaturePoints
例如:
augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints
因此,featurePoint
被Apple定义为:
由ARKit自动识别为连续点的一部分 表面,但没有相应的锚。
这意味着ARKit
处理每个视频帧以提取环境的特征,当您四处移动时,会检测到更多特征,因此设备可以更好地估计物理对象的方向和位置等属性
正如您将看到featurePoints
中的ARSCNView
显示为黄点,并且通常由以下原因导致功能提取不良:
(a)光线不足,
(b)缺乏质感,
(c)用户设备的不稳定运动。
要认识到的一个非常重要的事情是featurePoints
不一致,因为它们是从会话的每一帧渲染出来的,因此会随着光照条件,移动等而频繁变化。
基本上featurePoints
可以帮助您想象放置物体的适用性,例如featurePoints越多,环境中的纹理或特征就越多。
你并不需要真正看到它们,因为ARKit会使用这些内容,例如执行ARSCNHitTest
。
因此,featurePoints
可以在此基础上与ARSCNHitTest
一起使用,其中:{/ 1}:
在捕获的摄像机图像中搜索与SceneKit视图中的点对应的真实世界对象或AR锚点。
此hitTest的结果可以允许您放置虚拟内容,例如:
/// Performs An ARHitTest So We Can Place An SCNNode
///
/// - Parameter gesture: UITapGestureRecognizer
@objc func placeVideoNode(_ gesture: UITapGestureRecognizer){
//1. Get The Current Location Of The Tap
let currentTouchLocation = gesture.location(in: self.augmentedRealityView)
//2. Perform An ARHitTest To Search For Any Feature Points
guard let hitTest = self.augmentedRealityView.hitTest(currentTouchLocation, types: .featurePoint ).first else { return }
//3. If We Have Hit A Feature Point Get Its World Transform
let hitTestTransform = hitTest.worldTransform.columns.3
//4. Convert To SCNVector3
let coordinatesToPlaceModel = SCNVector3(hitTestTransform.x, hitTestTransform.y, hitTestTransform.z)
//5. Create An SCNNode & Add It At The Position Retrieved
let sphereNode = SCNNode()
let sphereGeometry = SCNSphere(radius: 0.1)
sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
sphereNode.geometry = sphereGeometry
sphereNode.position = coordinatesToPlaceModel
self.augmentedRealityView.scene.rootNode.addChildNode(sphereNode)
}
你可以在技术上测量featurePoints之间的距离,但这实际上是没有意义的,因为它们在不断变化,测量应用程序的目的是测量两个或多个固定点之间的距离。
网上有无数关于ARKit的教程,以及如何制作测量应用程序。
我希望这有助于您更好地理解。
<强>更新强>
有一个ARPointCloud:
AR的世界坐标空间中的点集合 会话。
可以使用以下方式访问:
ARFrame rawFeaturePoints属性,用于获取表示的点云 ARKit用于执行世界的场景分析的中间结果 跟踪。
但是,正如您所问,这基本上是您在设置debugOptions
时所看到的。
如果您很好奇并希望获得featurePoints,可以使用ARSession
的currentFrame来实现,例如:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
//1. Check Our Frame Is Valid & That We Have Received Our Raw Feature Points
guard let currentFrame = self.augmentedRealitySession.currentFrame,
let featurePointsArray = currentFrame.rawFeaturePoints?.points else { return }
}
这里可以看到一个例子:Visualizing Raw Feature Points