Swift -SCNCamera 的定义和用途是什么
Swift -What is a SCNCamera's Definition and Purpose
我找不到关于 SCNCamera
是什么及其用途的很好的解释。这是 Apple's definition:
A set of camera attributes that can be attached to a node to provide a
point of view for displaying the scene.
这个定义不清楚,因为我设置了场景并添加了一个 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 提供了很好的解释:
Think back to the analogy of the movie set from Chapter 1: to shoot a
scene, you’d position a camera looking at the scene and the resulting
image of that scene would be from the camera’s perspective.
Scene Kit
works in a similar fashion; the position of the node that contains the
camera determines the point of view from which you view the scene.
您不需要每个节点都有一个 SCNCamera
。您应该只需要为要显示的每个角度配备一台相机,甚至只需要一台。您可以使用其父项的 position
属性.
在整个场景中移动一个摄像机
您似乎正在使用 ARKit,它的行为略有不同。当使用 ARSCNView
而不是非 AR SCNView
时,您会得到以下行为:
- The view automatically renders the live video feed from the device camera as the scene background.
- The world coordinate system of the view's SceneKit scene directly responds to the AR world coordinate system established by the session
configuration.
- The view automatically moves its SceneKit camera to match the real-world movement of the device.
在这种情况下,您无需担心场景的摄像头,因为它由系统自动控制,以便与设备的移动相匹配以实现 AR。
有关详细信息,请参阅有关 SCNCamera
的 Apple 文档: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
我找不到关于 SCNCamera
是什么及其用途的很好的解释。这是 Apple's definition:
A set of camera attributes that can be attached to a node to provide a point of view for displaying the scene.
这个定义不清楚,因为我设置了场景并添加了一个 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 提供了很好的解释:
Think back to the analogy of the movie set from Chapter 1: to shoot a scene, you’d position a camera looking at the scene and the resulting image of that scene would be from the camera’s perspective.
Scene Kit works in a similar fashion; the position of the node that contains the camera determines the point of view from which you view the scene.
您不需要每个节点都有一个 SCNCamera
。您应该只需要为要显示的每个角度配备一台相机,甚至只需要一台。您可以使用其父项的 position
属性.
您似乎正在使用 ARKit,它的行为略有不同。当使用 ARSCNView
而不是非 AR SCNView
时,您会得到以下行为:
- The view automatically renders the live video feed from the device camera as the scene background.
- The world coordinate system of the view's SceneKit scene directly responds to the AR world coordinate system established by the session configuration.
- The view automatically moves its SceneKit camera to match the real-world movement of the device.
在这种情况下,您无需担心场景的摄像头,因为它由系统自动控制,以便与设备的移动相匹配以实现 AR。
有关详细信息,请参阅有关 SCNCamera
的 Apple 文档:SCNCamera - SceneKit
我从这个 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