1

我找不到一个很好的解释 aSCNCamera是什么以及它的目的。这是苹果的定义

一组相机属性,可以附加到节点以提供用于显示场景的视点。

这个定义不清楚,因为我设置了场景并添加了 aSCNNode而没有附加 a SCNCamera。设备摄像头的视角显示SCNNode我将其放置在的位置没有问题,并且场景显示良好。

设备的相机和相机有什么区别SCNCamera

SCNCamera将 a 附加到 aSCNNode与不使用a 有什么好处?

如果我有多个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])
}
4

2 回答 2

1

在 SceneKit 中,SCNCamera表示用户观看场景的视角。Ray Wenderlich提供了一个很好的解释:

回想一下第 1 章中电影场景的类比:要拍摄一个场景,您需要放置一台摄像机来观察该场景,而该场景的最终图像将来自摄像机的视角。

Scene Kit 的工作方式类似;包含相机的节点的位置决定了您查看场景的视点。

您不需要SCNCamera为每个节点设置一个。对于要显示的每个角度,您应该只需要一台相机,甚至只需要一台。您可以使用其父级position属性在整个场景中移动一台摄像机。

看起来你正在使用 ARKit,它的行为有点不同。当使用一个ARSCNView,而不是一个非 AR SCNView,你会得到以下行为:

  • 该视图自动将来自设备摄像头的实时视频馈送渲染为场景背景。
  • 视图的 SceneKit 场景的世界坐标系直接响应会话配置建立的 AR 世界坐标系。
  • 视图会自动移动其 SceneKit 相机以匹配设备的真实移动。

在这种情况下,您无需担心场景的摄像头,因为它会自动由系统控制,以匹配设备的 AR 运动。

有关更多详细信息,请参阅 Apple 的文档SCNCameraSCNCamera - SceneKit

于 2020-02-18T02:55:17.997 回答
0

我从这个答案中得到了我的问题的答案。基本上在 ARKit 中使用ARSCNView相机来自sceneView.pointOfView但在 SceneKit 中你需要创建一个相机来获取相机 pov(下面的代码)。

获取相机节点

要获取相机节点,这取决于您使用的是 SCNKit、ARKit 还是其他框架。下面是 ARKit 和 SceneKit 的示例。

使用 ARKit,您可以使用 ARSCNView 渲染与相机内容重叠的 SCNScene 的 3D 对象。您可以从 ARSCNView 的 pointOfView 属性中获取相机节点:

let cameraNode = sceneView.pointOfView

对于 SceneKit,您有一个渲染 SCNScene 的 3D 对象的 SCNView。您可以创建相机节点并将它们放置在您想要的任何位置,因此您可以执行以下操作:

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
于 2020-02-18T02:56:01.167 回答