Если вы используете ARFaceTrackingConfiguration (только для iPhone X), есть как минимум два способа добиться этого (я думаю, что второй вариант лучше).
Первый метод
Вы можете использовать глубину данных ИК-камеры:
yourARSceneView.session.currentFrame?.capturedDepthData?.depthDataMap
Это вернет CVPixelBuffer размером 640x360, содержащий данные глубины для каждого пикселя (в основном расстояние между ИК-камерой и реальными объектами в мире). Вы можете получить доступ к данным CVPixelBuffer через доступные расширения, такие как , это . Данные о глубине выражены в метрах. Получив данные о глубине, вам нужно будет выбрать или определить, какие из них являются частью лица пользователя. Вы также должны быть осторожны, что «камера, измеряющая глубину, предоставляет данные с частотой кадров, отличной от цветовой камеры, поэтому значение этого свойства также может быть равно нулю, если данные о глубине не были получены одновременно с текущим цветным изображением». Для получения дополнительной информации: AVDepthData
Второй метод (рекомендуется)
Другой способ получить расстояние между устройством и лицом пользователя - преобразовать положение обнаруженного лица пользователя в систему координат камеры.
Чтобы сделать это, вам нужно будет использовать метод convertPosition из SceneKit, чтобы переключать пространство координат из пространства координат лица в пространство координат камеры.
let positionInCameraSpace = theFaceNode.convertPosition(pointInFaceCoordinateSpace, to: yourARSceneView.pointOfView)
theFaceNode
- это SCNNode, созданный ARKit, представляющий лицо пользователя.
Свойство pointOfView
вашего ARSCNView
возвращает узел, с которого просматривается сцена, в основном камера. pointInFaceCoordinateSpace
может быть любыми вершинами грани сетки или просто положением theFaceNode
(которое является источником системы координат грани ).
Здесь positionInCameraSpace
- это SCNVector3
, представляющий положение заданной вами точки в пространстве координат камеры. Затем вы можете получить расстояние между точкой и камерой, используя значения x, y и z этого SCNVector3 (выраженные в метрах).
Полагаю, второй метод лучше, так как выглядит точнее, и вы можете точно выбрать, какую точку лица вы хотите измерить. Вы также можете использовать преобразования, как сказал Rom4in (я думаю, что метод convertPosition использует преобразования). Надеюсь, это поможет, и мне также любопытно узнать, есть ли более простые способы добиться этого.