SCNCamera 以编程方式制作的位置不正确
SCNCamera made programmatically not in the correct position
我正在尝试以编程方式为我的 MainScene.scn
文件创建一个相机。
我需要在代码中创建相机,因为我想制作一个 camera orbit 节点,这是我能想到的唯一方法。我也想继续使用我的场景文件。
这是我的视图控制器中的代码(简化版):
import UIKit
import SceneKit
class GameViewController: UIViewController {
// MARK: Scene objects
private var gameView: SCNView!
private var gameScene: SCNScene!
private var gameCameraNode: SCNNode!
// MARK: View controller overrides
override func viewDidLoad() {
super.viewDidLoad()
// Setup game
initView()
initScene()
initCamera()
}
}
private extension GameViewController {
// Initialise the view and scene
private func initView() {
self.view = SCNView(frame: view.bounds) // Create an SCNView to play the game within
gameView = self.view as? SCNView // Assign the view
gameView.showsStatistics = true // Show game statistics
gameView.autoenablesDefaultLighting = true // Allow default lighting
gameView.antialiasingMode = .multisampling2X // Use anti-aliasing for a smoother look
}
private func initScene() {
gameScene = SCNScene(named: "art.scnassets/MainScene.scn")! // Assign the scene
gameView.scene = gameScene // Set the game view's scene
gameView.isPlaying = true // The scene is playing (not paused)
}
private func initCamera() {
gameCameraNode = SCNNode()
gameCameraNode.camera = SCNCamera()
gameCameraNode.position = SCNVector3(0, 3.5, 27)
gameCameraNode.eulerAngles = SCNVector3(-2, 0, 0)
gameScene.rootNode.addChildNode(gameCameraNode)
gameView.pointOfView = gameCameraNode
}
}
可以轻松粘贴此代码以替换默认的视图控制器代码。您需要做的就是添加 MainScene.scn
并拖入类似方框的内容。
如果你尝试代码,相机的位置是错误的。如果我在场景中为相机使用相同的属性,它会起作用,但这不是我想要的。
根据我的阅读,SceneKit 可能正在创建默认相机,如前所述 and here。但是,我按照他们在这些答案中所说的那样设置 pointOfView
属性,但它仍然不起作用。
如何以编程方式将相机放置在场景中的正确位置?
一段时间后,我发现您实际上可以直接在场景生成器中添加空节点。我最初只想要一个程序化的答案,因为我想制作一个像我链接到的问题一样的相机轨道节点。现在我可以添加一个空节点,我可以将轨道的 child 设为摄像机。
这不需要代码,除非您想访问节点(例如更改位置或旋转):
gameCameraNode = gameView.pointOfView // Use camera object from scene
gameCameraOrbitNode = gameCameraNode.parent // Use camera orbit object from scene
创建轨道节点的步骤如下:
2) 像这样设置您的 Scene Graph
:
我正在尝试以编程方式为我的 MainScene.scn
文件创建一个相机。
我需要在代码中创建相机,因为我想制作一个 camera orbit 节点,这是我能想到的唯一方法。我也想继续使用我的场景文件。
这是我的视图控制器中的代码(简化版):
import UIKit
import SceneKit
class GameViewController: UIViewController {
// MARK: Scene objects
private var gameView: SCNView!
private var gameScene: SCNScene!
private var gameCameraNode: SCNNode!
// MARK: View controller overrides
override func viewDidLoad() {
super.viewDidLoad()
// Setup game
initView()
initScene()
initCamera()
}
}
private extension GameViewController {
// Initialise the view and scene
private func initView() {
self.view = SCNView(frame: view.bounds) // Create an SCNView to play the game within
gameView = self.view as? SCNView // Assign the view
gameView.showsStatistics = true // Show game statistics
gameView.autoenablesDefaultLighting = true // Allow default lighting
gameView.antialiasingMode = .multisampling2X // Use anti-aliasing for a smoother look
}
private func initScene() {
gameScene = SCNScene(named: "art.scnassets/MainScene.scn")! // Assign the scene
gameView.scene = gameScene // Set the game view's scene
gameView.isPlaying = true // The scene is playing (not paused)
}
private func initCamera() {
gameCameraNode = SCNNode()
gameCameraNode.camera = SCNCamera()
gameCameraNode.position = SCNVector3(0, 3.5, 27)
gameCameraNode.eulerAngles = SCNVector3(-2, 0, 0)
gameScene.rootNode.addChildNode(gameCameraNode)
gameView.pointOfView = gameCameraNode
}
}
可以轻松粘贴此代码以替换默认的视图控制器代码。您需要做的就是添加 MainScene.scn
并拖入类似方框的内容。
如果你尝试代码,相机的位置是错误的。如果我在场景中为相机使用相同的属性,它会起作用,但这不是我想要的。
根据我的阅读,SceneKit 可能正在创建默认相机,如前所述 pointOfView
属性,但它仍然不起作用。
如何以编程方式将相机放置在场景中的正确位置?
一段时间后,我发现您实际上可以直接在场景生成器中添加空节点。我最初只想要一个程序化的答案,因为我想制作一个像我链接到的问题一样的相机轨道节点。现在我可以添加一个空节点,我可以将轨道的 child 设为摄像机。
这不需要代码,除非您想访问节点(例如更改位置或旋转):
gameCameraNode = gameView.pointOfView // Use camera object from scene
gameCameraOrbitNode = gameCameraNode.parent // Use camera orbit object from scene
创建轨道节点的步骤如下:
2) 像这样设置您的 Scene Graph
: