Вы можете использовать характерные точки, но я думаю, что это, вероятно, излишне, так как подобное может быть хорошим началом:
Используя currentFrame
из 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())
}
}
Также есть и другие функции обратного вызова делегата, которые вы можете использовать, например:
func session(_ session: ARSession, didFailWithError error: Error) {
print("The ARSession Failed")
}
func sessionWasInterrupted(_ session: ARSession) {
print("ARSession Was Interupted")
}
Эти Рекомендации ARKit также предоставляют полезную информацию о том, как обрабатывать эти состояния: Руководства Apple
Если вы действительно хотите отслеживать число featurePoints
однако вы можете сделать что-то вроде этого:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
guard let currentFrame = self.augmentedRealitySession.currentFrame,
let featurePointCount = currentFrame.rawFeaturePoints?.points.count else { return }
print("Number Of Feature Points In Current Session = \(featurePointCount)")
}
И если вы хотите увидеть пример, вы можете посмотреть здесь: Пример характерных моментов
Надеюсь, это поможет...