我正在寻找一种方法来检测空间跟踪何时工作/不工作"在ARKit中,即当ARKit有足够的视觉信息来启动3d空间跟踪时。
在我尝试过的其他应用中,如果ARKit没有从相机获取足够的信息,系统会提示用户环顾手机/相机以恢复空间跟踪。我甚至看到过带有进度条的应用程序,显示用户需要多少移动设备才能恢复跟踪。
检测是否有可用于检查ARSessions当前帧有多少 rawFeaturePoints 的好方法?例如,如果当前帧具有超过100个rawFeaturePoints,我们可以假设空间跟踪正在起作用。
这是一个很好的方法,还是在ARKit中有内置功能或更好的方法来检测空间跟踪是否有效我不知道什么?
答案 0 :(得分:1)
你可以使用特征点,但我认为这可能是矫枉过正的,因为像这样的事情可能是一个好的开始:
使用currentFrame
的{{1}},您可以像这样获得当前的跟踪状态:
ARSession
您可以在//------------------------------------------------
//MARK: ARSession Extension To Log Tracking States
//------------------------------------------------
extension ARSession{
/// Returns The Status Of The Current ARSession
///
/// - Returns: String
func sessionStatus() -> String? {
//1. Get The Current Frame
guard let frame = self.currentFrame else { return nil }
var status = "Preparing Device.."
//1. Return The Current Tracking State & Lighting Conditions
switch frame.camera.trackingState {
case .normal: status = ""
case .notAvailable: status = "Tracking Unavailable"
case .limited(.excessiveMotion): status = "Please Slow Your Movement"
case .limited(.insufficientFeatures): status = "Try To Point At A Flat Surface"
case .limited(.initializing): status = "Initializing"
case .limited(.relocalizing): status = "Relocalizing"
}
guard let lightEstimate = frame.lightEstimate?.ambientIntensity else { return nil }
if lightEstimate < 100 { status = "Lighting Is Too Dark" }
return status
}
}
回调中调用类似的内容:
ARSCNViewDelegate
您还可以使用其他委托回调,例如:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
DispatchQueue.main.async {
//1. Update The Tracking Status
print(self.augmentedRealitySession.sessionStatus())
}
}
这些ARKit指南还提供了一些有用的信息,如如何处理这些状态:Apple Guidelines
如果你确实想跟踪func session(_ session: ARSession, didFailWithError error: Error) {
print("The ARSession Failed")
}
func sessionWasInterrupted(_ session: ARSession) {
print("ARSession Was Interupted")
}
的数量,你可以这样做:
featurePoints
如果你想看一个例子,你可以看一下:Feature Points Example
希望它有所帮助...