Код: Выделить всё
camera
/
/
/
/
/
board /
___________
Я пытался вычислить, как далеко будет двигаться камера. по крайней мере, нужно видеть всю ширину доски. Я нарисовал такую диаграмму:

и выяснили, что расстояние равно половине ширины доски, разделенной на tan(FOV/2).
Переведем это в код:
Код: Выделить всё
private func setupCamera(boardWidth: CGFloat, maxBoardZ: CGFloat, boardCenterX: CGFloat) {
cameraNode = SCNNode()
let camera = SCNCamera()
cameraNode.camera = camera
let boardRadius = boardWidth / 2
let cameraDistance = boardRadius / tan(degreesToRadians(camera.fieldOfView) / 2)
let cameraHeight: Float = 10
cameraNode.position = SCNVector3(x: Float(boardCenterX), y: cameraHeight, z: Float(maxBoardZ + cameraDistance))
cameraNode.eulerAngles.x = -0.5
}
Код: Выделить всё
cameraNode
Это выглядит нормально в портретном режиме (это только часть на весь экран телефона):

Камера не могла приблизиться к доска без обрезки частей платы.
Но в альбомной ориентации плата чрезвычайно мала по сравнению с SCNView, в котором она находится:

Камера могла сильно сдвинуться ближе! Я ожидал чего-то вроде:

Обратите внимание на область белого фона — это SCNView.
Я думал, что поле зрения могло измениться в альбомной ориентации, но когда я проверил в отладчике , угол обзора всегда составляет 60 градусов, независимо от ориентация. Кажется, что хотя у SCNCamera есть свойство fieldOfView, у SCNView также есть свое собственное, отдельное поле зрения, которое зависит от его ширины и высоты, и я понятия не имею, как получить к нему доступ.
Как расположить камеру так, чтобы вся плата только помещалась внутри SCNView?
Подробнее здесь: https://stackoverflow.com/questions/672 ... ts-in-view