Получение позиции ARCamera
В ARKit вы можете получить позицию ARCamera через точечную нотацию ARFrame. Каждый ARFrame (из 60 кадров в секунду) содержит матрицу камеры 4x4. Чтобы обновить позицию ARCamera, используйте метод экземпляра renderer(_:didUpdate:for:)
.
Вот начальный метод, называемый renderer(_:didAdd:for:)
:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
let frame = sceneView.session.currentFrame
print(frame?.camera.transform.columns.3.x as Any)
print(frame?.camera.transform.columns.3.y as Any)
print(frame?.camera.transform.columns.3.z as Any)
// ...
}
}
Получение координат привязки и размера изображения
Когда вы используете Vision и ARKit вместе, самый простой способ получить координаты отслеживаемого изображения в ARKit - использовать свойство экземпляра transform
для ARImageAnchor
, выраженное в матрице SIMD 4x4.
var transform: simd_float4x4 { get }
Эта матрица, кодирующая положение, ориентацию и масштаб привязки относительно мирового координатного пространства сеанса AR, в котором размещается привязка.
Вот как может выглядеть ваш код:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor
else { return }
print(imageAnchor.transform.columns.3.x)
print(imageAnchor.transform.columns.3.y)
print(imageAnchor.transform.columns.3.z)
// ...
}
}
Если вы хотите узнать, что такое матрица SIMD 4x4, прочтите этот пост.
Также для получения physical size
(в метрах) отслеживаемой фотографии используйте это свойство:
// set in Xcode's `AR Resources` Group
imageAnchor.referenceImage.physicalSize
Чтобы вычислить коэффициент между начальным размером и предполагаемым физическим размером, используйте это свойство:
imageAnchor.estimatedScaleFactor
Обновление координат привязки и размера изображения
Чтобы постоянно обновлять координаты ARImageAnchor
и размер изображения, используйте второй метод из ARSCNViewDelegate
:
optional func renderer(_ renderer: SCNSceneRenderer,
didUpdate node: SCNNode,
for anchor: ARAnchor)
Для получения ограничивающей рамки (тип CGRect
) вашей фотографии в Vision используйте это свойство экземпляра:
VNDetectedObjectObservation().boundingBox
person
Andy Fedoroff
schedule
30.06.2020