Swift - SCNCamera的定义和目的是什么



我找不到关于SCNCamera是什么及其目的的好解释。这是苹果的定义:

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

此定义不清楚,因为我设置了场景并添加了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])
}

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

回想一下第1章中电影场景的类比:拍摄一个 场景中,您将放置一个摄像机查看场景和结果 该场景的图像将从摄像机的角度拍摄。

场景套件 以类似的方式工作;包含 照相机确定查看场景的视角。

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

看起来您正在使用 ARKit,它的行为略有不同。当使用ARSCNView,而不是非ARSCNView时,你会得到以下行为:

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

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

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

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

获取相机节点

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

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

let cameraNode = sceneView.pointOfView

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

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

相关内容

  • 没有找到相关文章

最新更新