Swift -Что такое определение и цель SCNCamera - PullRequest
0 голосов
/ 18 февраля 2020

Я не могу найти хорошее объяснение того, что такое SCNCamera и какова его цель. Это определение Apple :

Набор атрибутов камеры, которые можно прикрепить к узлу, чтобы обеспечить точку обзора для отображения сцены.

Это определение неясно, потому что я настроил сцену и добавил SCNNode без присоединения SCNCamera к ней. Точка зрения с камеры устройства показывает SCNNode в том месте, где я его расположил без проблем, и сцена отображается нормально.

В чем разница между камерой устройства и SCNCamera?

Какая польза от присоединения SCNCamera к SCNNode против его использования?

Если у меня есть кратный SCNNodes (все отделены друг от друга без иерархии) нужен ли каждому узлу свой собственный SCNCamera?

Если у меня есть несколько SCNNodes в hierarchy (родительский узел с дочерними узлами) нужен ли каждому узлу собственный SCNCamera или только родительский узел?

lazy var sceneView: ARSCNView = {
    let sceneView = ARSCNView()
    sceneView.translatesAutoresizingMaskIntoConstraints = false
    sceneView.delegate = self
    return sceneView
}()

let configuration = ARWorldTrackingConfiguration()

override func viewDidLoad() {
    super.viewDidLoad()

    // pin sceneView to the view

    let material = SCNMaterial()
    material.diffuse.contents = UIImage(named: "earth")

    let plane = SCNPlane(width: 0.33, height: 0.33)
    plane.materials = [material]
    plane.firstMaterial?.isDoubleSided = true

    let myNode = SCNNode(geometry: plane)
    myNode.name = "earth"
    myNode.position = SCNVector3(0.0, 0.6, -0.9)

    sceneView.scene.rootNode.addChildNode(myNode)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    sceneView.session.run(configuration, options: [])
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillAppear(animated)

    sceneView.session.pause()
    sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

В SceneKit SCNCamera представляет точку зрения, с которой пользователь видит сцену. Рэй Вендерлих дает хорошее объяснение:

Вспомните аналогию с mov ie, заданным в главе 1: чтобы снимать сцену, вы должны расположить камеру с видом на сцене и полученное изображение этой сцены будет с точки зрения камеры.

Scene Kit работает аналогичным образом; положение узла, содержащего камеру, определяет точку обзора, с которой вы просматриваете сцену.

Вам не нужно иметь SCNCamera для каждого узла. У вас должна быть только одна камера для каждого угла, который вы хотите показать, или даже только одна. Вы можете перемещать одну камеру по всей сцене, используя ее родительское свойство position.

Похоже, вы работаете с ARKit, который ведет себя немного по-другому. При использовании ARSCNView, в отличие от не AR SCNView, вы получаете следующий вид:

  • Представление автоматически отображает видео в реальном времени с камеры устройства в качестве фона сцены.
  • Мировая система координат сцены SceneKit представления напрямую реагирует на мировую систему координат AR, установленную конфигурацией сеанса.
  • Представление автоматически перемещает свой SceneKit камера, чтобы соответствовать реальному движению устройства.

В этом случае вам не нужно беспокоиться о камере сцены, так как она автоматически контролируется системой, так что что он соответствует движению устройства для AR.

Для получения дополнительной информации см. документацию Apple по SCNCamera: SCNCamera - SceneKit

0 голосов
/ 18 февраля 2020

Я получил ответ на свой вопрос из этого ответа . В основном в ARKit с использованием ARSCNView камера поставляется с sceneView.pointOfView, но в SceneKit вам нужно создать камеру для получения pov камеры (код ниже).

Получение узла камеры

Чтобы получить узел камеры, это зависит от того, используете ли вы SCNKit, ARKit или другой фреймворк. Ниже приведены примеры для ARKit и SceneKit.

С ARKit у вас есть ARSCNView для визуализации трехмерных объектов SCNScene, перекрывающих содержимое камеры. Вы можете получить узел камеры из свойства ARSCNView pointOfView:

let cameraNode = sceneView.pointOfView

Для SceneKit у вас есть SCNView, который рендерит трехмерные объекты SCNScene. Вы можете создавать узлы камеры и размещать их там, где хотите, так что вы будете делать что-то вроде:

let scnScene = SCNScene()
// (Configure scnScene here if necessary)
scnView.scene = scnScene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10)  // For example
scnScene.rootNode.addChildNode(cameraNode)

После настройки узла камеры вы можете получить доступ к текущей камере так же, как ARKit:

let cameraNode = scnView.pointOfView
...