Код: Выделить всё
public extension SK3DNode {
static func forModel(_ model: SCNNode, size: CGSize) -> SK3DNode {
let scene = SCNScene()
let node3D = SK3DNode()
node3D.scnScene = scene
node3D.viewportSize = size
scene.rootNode.addChildNode(model)
let camera = SCNCamera()
let cameraNode = SCNNode()
cameraNode.camera = camera
node3D.pointOfView = cameraNode
cameraNode.constraints = [SCNLookAtConstraint(target: model)]
// TODO: adjust position to center fit the model
cameraNode.position = SCNVector3(x: 0, y: 0, z: 4)
return node3D
}
}
Код: Выделить всё
let planeX = model.boundingSize.x
let planeY = model.boundingSize.y
let planeLength = max(planeX, planeY)
let angleInRadian = NumberUtil.degreeToRadian(degree: camera.fieldOfView)
let distance = planeLength / 2 / tan(angleInRadian/2)
Это похоже на то, что я Хочу, но при расчете не учитывается размер и соотношение сторон области просмотра, поэтому я не думаю, что это правильно. Есть ли лучший способ вычислить это?
РЕДАКТИРОВАТЬ:
Здесь вы можете скачать пример проекта: https://drive.google.com /file/d/1W_v0jMR1w9SkP-__SlKcPfiRF9cpTyEb/view?usp=sharing
Когда вы запустите его, вы увидите 4 SK3DNode (см. 4 синие области на скриншоте ниже), а это (сверху вниз):
- Высокое окно просмотра с широкой 3D-моделью внутри.
- Высокое окно просмотра с высокой 3d-моделью внутри
- Широкое окно просмотра с высокой 3d-моделью внутри
- Широкое окно просмотра с широкой 3d моделью внутри
[img]https://i. sstatic.net/lQx4tKJ9.png[/img]
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-scenekit