无法解释 Arkit 测量 IOS 应用程序中的点云行为
Unable to interpret pointcloud behaviour in Arkit measuring IOS Applications
我是开发 IOS 应用程序的新手,我刚刚开始从 Github.
构建一些示例 Arkit 应用程序
一件事,我试过的是这个 link : https://github.com/ttaulli/MeasureAR
这基本上是测量两点之间的距离。当我在 IPhone 中启动此应用程序时,我可以看到点云(我想要测量的对象周围 3D 点的集合)。
想不通的是,为什么选的两个测量点不是点云的?
我还想知道以下内容:
1) 用于 arkit 测量应用的点云的确切目的是什么?
2)点云密度是否取决于物体的颜色(应用基本上运行在实时相机上)。是否有任何其他因素影响此点云?
我也很高兴,如果有人能提供任何其他示例 Arkit 测量应用程序,要求用户从点云中选择两个点。
提前致谢!
您所指的 pointCloud
实际上是 ARSCNDebugOptions
的一部分,它们是:
Options for drawing overlay content to aid debugging of AR tracking in
a SceneKit view.
你可以这样设置:ARSCNDebugOptions.showFeaturePoints
例如:
augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints
A featurePoint
因此被 Apple 定义为:
A point automatically identified by ARKit as part of a continuous
surface, but without a corresponding anchor.
这意味着ARKit
处理每个视频帧以提取环境特征,并且当您四处移动时,会检测到更多特征,因此设备可以更好地估计方向和位置等属性实物。
如您所见featurePoints
在ARSCNView
中显示为黄点,特征提取不佳通常由以下原因引起:
(a) 光线不足,
(b) 缺乏质感,
(c) 用户设备移动不稳定。
需要认识到的一件非常重要的事情是,featurePoints
不一致,因为它们是从会话的每一帧渲染的,因此经常随着光照条件、运动等而变化。
基本上 featurePoints
可以帮助您直观地了解放置物体的适合性,例如特征点越多,环境中的纹理或特征就越多。
你真的不需要看到它们本身,因为 ARKit 在后台使用它们,比如执行 ARSCNHitTest
.
因此,在此基础上,featurePoints
可以与 ARSCNHitTest
结合使用,其中:
在捕获的相机图像中搜索与 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)
}
从技术上讲,您可以测量特征点之间的距离,但这实际上毫无意义,因为它们不断变化,而测量应用程序的目的是测量两个或多个固定点之间的距离。
网上有无数关于 ARKit 以及如何制作测量应用程序的教程。
希望这有助于您更好地理解。
更新:
有一个 ARPointCloud 是:
A collection of points in the world coordinate space of the AR
session.
并且可以使用以下方式访问:
ARFrame rawFeaturePoints property to obtain a point cloud representing
intermediate results of the scene analysis ARKit uses to perform world
tracking.
但是,正如您所问,这基本上就是您在设置 debugOptions
时看到的内容。
如果你好奇并想获得特征点,你可以使用 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
我是开发 IOS 应用程序的新手,我刚刚开始从 Github.
构建一些示例 Arkit 应用程序一件事,我试过的是这个 link : https://github.com/ttaulli/MeasureAR
这基本上是测量两点之间的距离。当我在 IPhone 中启动此应用程序时,我可以看到点云(我想要测量的对象周围 3D 点的集合)。 想不通的是,为什么选的两个测量点不是点云的?
我还想知道以下内容:
1) 用于 arkit 测量应用的点云的确切目的是什么?
2)点云密度是否取决于物体的颜色(应用基本上运行在实时相机上)。是否有任何其他因素影响此点云?
我也很高兴,如果有人能提供任何其他示例 Arkit 测量应用程序,要求用户从点云中选择两个点。
提前致谢!
您所指的 pointCloud
实际上是 ARSCNDebugOptions
的一部分,它们是:
Options for drawing overlay content to aid debugging of AR tracking in a SceneKit view.
你可以这样设置:ARSCNDebugOptions.showFeaturePoints
例如:
augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints
A featurePoint
因此被 Apple 定义为:
A point automatically identified by ARKit as part of a continuous surface, but without a corresponding anchor.
这意味着ARKit
处理每个视频帧以提取环境特征,并且当您四处移动时,会检测到更多特征,因此设备可以更好地估计方向和位置等属性实物。
如您所见featurePoints
在ARSCNView
中显示为黄点,特征提取不佳通常由以下原因引起:
(a) 光线不足,
(b) 缺乏质感,
(c) 用户设备移动不稳定。
需要认识到的一件非常重要的事情是,featurePoints
不一致,因为它们是从会话的每一帧渲染的,因此经常随着光照条件、运动等而变化。
基本上 featurePoints
可以帮助您直观地了解放置物体的适合性,例如特征点越多,环境中的纹理或特征就越多。
你真的不需要看到它们本身,因为 ARKit 在后台使用它们,比如执行 ARSCNHitTest
.
因此,在此基础上,featurePoints
可以与 ARSCNHitTest
结合使用,其中:
在捕获的相机图像中搜索与 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)
}
从技术上讲,您可以测量特征点之间的距离,但这实际上毫无意义,因为它们不断变化,而测量应用程序的目的是测量两个或多个固定点之间的距离。
网上有无数关于 ARKit 以及如何制作测量应用程序的教程。
希望这有助于您更好地理解。
更新:
有一个 ARPointCloud 是:
A collection of points in the world coordinate space of the AR session.
并且可以使用以下方式访问:
ARFrame rawFeaturePoints property to obtain a point cloud representing intermediate results of the scene analysis ARKit uses to perform world tracking.
但是,正如您所问,这基本上就是您在设置 debugOptions
时看到的内容。
如果你好奇并想获得特征点,你可以使用 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