ARKit и RealityKit определенно имеют одинаковые значения параметра focal length
. Это потому, что эти две структуры должны работать вместе. И хотя на данный момент нет свойства экземпляра focal length
для ARView
, вы можете легко распечатать в консоли a фокусное расстояние для ARSCNView
или SCNView
.
@IBOutlet var sceneView: ARSCNView!
sceneView.pointOfView?.camera?.focalLength
Однако примите во внимание, что фреймворки ARKit, RealityKit и SceneKit не используют разрешение экрана, они скорее используют размер области просмотра. Коэффициент увеличения для окон просмотра iPhone обычно составляет 1/2
или 1/3
.
Внутренняя матрица камеры
Как вы сказали, в ARKit есть матрица камеры 3x3, позволяющая конвертировать между 2D-плоскостью камеры и 3D-пространством мировых координат.
var intrinsics: simd_float3x3 { get }
Используя эту матрицу, вы можете распечатать 4 важных параметра: fx
, fy
, ox
и oy
. Распечатаем их все:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print(" Focal Length: \(self.sceneView.pointOfView?.camera?.focalLength)")
print("Sensor Height: \(self.sceneView.pointOfView?.camera?.sensorHeight)")
// SENSOR HEIGHT IN mm
let frame = self.sceneView.session.currentFrame
// INTRINSICS MATRIX
print("Intrinsics fx: \(frame?.camera.intrinsics.columns.0.x)")
print("Intrinsics fy: \(frame?.camera.intrinsics.columns.1.y)")
print("Intrinsics ox: \(frame?.camera.intrinsics.columns.2.x)")
print("Intrinsics oy: \(frame?.camera.intrinsics.columns.2.y)")
}
Для iPhone X
печатаются следующие значения:
Когда вы примените свои формулы, вы получите невероятный результат (прочтите, чтобы узнать, почему).
О широкоугольном объективе и OIS
В iPhone X есть два датчика изображения, и оба модуля камеры оснащены оптическим стабилизатором изображения (OIS). Широкоугольный объектив имеет фокусное расстояние 28 миллиметров и диафрагму f/1.8
, а телеобъектив - 56 мм и f/2.4
.
ARKit и RealityKit используют задний модуль широкоугольного объектива. В случае с iPhone X это 28-миллиметровый объектив. Но как насчет напечатанного значения focal length = 20.78 mm
, а? Я считаю, что несоответствие значений 28 mm
и 20.78 mm
связано с тем, что стабилизация видео съедает около 25% всей площади изображения. Это делается для того, чтобы в конечном итоге получить значение фокусного расстояния 28 mm
для окончательного изображения.
Красная рамка - граница обрезки на этапе стабилизации.
Заключение
Это мой собственный вывод. Я не нашел никаких справочных материалов по этой теме, поэтому не судите меня строго, если мое мнение неверно (я допускаю, что это может быть).
Все мы знаем факт, что дрожание камеры усиливается с увеличением фокусного расстояния. Таким образом, чем меньше значение фокусного расстояния, тем меньше дрожание камеры. Это очень важно для качественного отслеживания мира без дрожания в приложении AR. Кроме того, я твердо уверен, что оптические стабилизаторы изображения работают намного лучше с меньшими значениями фокусного расстояния. Следовательно, неудивительно, что инженеры ARKit выбрали более низкое значение focal length
для опыта AR (захват более широкой области изображения), а затем после стабилизации мы получаем модифицированную версию изображения, как и focal length = 28 mm
.
Так что, по моему скромному мнению, нет смысла рассчитывать РЕАЛЬНОЕ focal length
для RealityKit и ARKit, потому что есть ФЕЙК focal length
, уже реализованный инженерами Apple для надежной работы с дополненной реальностью.
person
Andy Fedoroff
schedule
28.06.2020