【问题标题】:Swift -What is a SCNCamera's Definition and PurposeSwift - 什么是 SCNCamera 的定义和用途
【发布时间】:2020-06-01 23:18:56
【问题描述】:

我无法很好地解释SCNCamera 是什么以及它的用途。这是Apple's definition

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

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

设备的摄像头和SCNCamera有什么区别?

SCNCamera 附加到SCNNode 与不使用有什么好处?

如果我有多个SCNNodes(彼此之间没有层次结构),每个节点是否都需要它自己的SCNCamera

如果我在hierarchy(带有子节点的父节点)中有多个SCNNodes,每个节点都需要它自己的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])
}

【问题讨论】:

    标签: ios swift arkit scnnode scncamera


    【解决方案1】:

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

    回想一下第 1 章中电影场景的类比:拍摄一个 场景,你需要放置一个摄像机来观察场景和结果 该场景的图像将来自相机的视角。

    场景套件 以类似的方式工作;包含的节点的位置 相机决定了您观看场景的视角。

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

    您似乎正在使用 ARKit,其行为方式略有不同。当使用ARSCNView,而不是非AR SCNView,你会得到以下行为:

    • 视图会自动将来自设备摄像头的实时视频源渲染为场景背景。
    • view的SceneKit场景的世界坐标系直接响应session建立的AR世界坐标系 配置。
    • 视图会自动移动其 SceneKit 摄像头以匹配设备的实际移动。

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

    有关更多详细信息,请参阅 Apple 在SCNCamera 上的文档:SCNCamera - SceneKit

    【讨论】:

    • 谢谢,您在我输入刚刚在另一个答案中找到的答案时添加了答案。
    【解决方案2】:

    我从这个answer 中得到了我的问题的答案。基本上在使用ARSCNView 的ARKit 中,摄像头来自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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 2012-04-17
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多