ios - Swift - 什么是 SCNCamera 的定义和用途
问题描述
我找不到一个很好的解释 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])
}
解决方案
在 SceneKit 中,SCNCamera
表示用户观看场景的视角。Ray Wenderlich提供了一个很好的解释:
回想一下第 1 章中电影场景的类比:要拍摄一个场景,您需要放置一台摄像机来观察该场景,而该场景的最终图像将来自摄像机的视角。
Scene Kit 的工作方式类似;包含相机的节点的位置决定了您查看场景的视点。
您不需要SCNCamera
为每个节点设置一个。对于要显示的每个角度,您应该只需要一台相机,甚至只需要一台。您可以使用其父级position
属性在整个场景中移动一台摄像机。
看起来你正在使用 ARKit,它的行为有点不同。当使用一个ARSCNView
,而不是一个非 AR SCNView
,你会得到以下行为:
- 该视图自动将来自设备摄像头的实时视频馈送渲染为场景背景。
- 视图的 SceneKit 场景的世界坐标系直接响应会话配置建立的 AR 世界坐标系。
- 视图会自动移动其 SceneKit 相机以匹配设备的真实移动。
在这种情况下,您无需担心场景的摄像头,因为它会自动由系统控制,以匹配设备的 AR 运动。
有关更多详细信息,请参阅 Apple 的文档SCNCamera
:SCNCamera - SceneKit