如何在 Scene Kit 中对同一场景使用多个摄像头
How to use multiple cameras for the same scene in Scene Kit
我有 2 个彼此相邻的 SCNView,它们应该通过不同的相机显示相同的场景。
在我看来,Scene Kit 将该节点与节点层次结构中最高的相机一起使用,所以我尝试了类似的方法
leftSceneView.scene?.rootNode.addChildNode(scene.rootNode)
rightSceneView.scene?.rootNode.addChildNode(scene.rootNode)
leftSceneView.scene?.rootNode.addChildNode(cameraNodeLeft)
rightSceneView.scene?.rootNode.addChildNode(cameraNodeRight)
但我收到了错误消息 [SCNKit ERROR] removing the root node of a scene from its scene is not allowed
,它根本不起作用。
有人建议我如何实现吗?
托比
设置视角以使用SCNView的"pointOfView"属性渲染场景。
scnView.pointOfView = cameraNodeLeft;
这个答案是关于(@WolfLink 提到的)具有多个 SCNView 对象的问题,不同的相机显示相同的 SCNScene 导致整个更新序列发生多次。
要解决此问题,您只需将 SCNSceneRendererDelegate 设置为 仅使用一个 SCNView 对象。假设代理正在处理 SCNScene 中的所有节点并相应地更新它们,其他没有分配代理的 SCNView 对象仍然能够看到所有发生的更改。这是因为更改是在所有 SCNView 对象都连接到的实际 SCNScene 中更新的。
因此,使用@Toyos 的原始答案,在不导致整个更新序列触发两次的情况下使用 2 个摄像头的方法是:
// Set up sceneView 1
sceneView1.scene = scnScene
sceneView1.pointOfView = scnScene.camera1
sceneView1.delegate = scnScene
// Set up sceneView 2
sceneView2.scene = scnScene
sceneView2.pointOfView = scnScene.camera2
(免责声明:我本来打算对@Toyos 的回答发表评论,但我目前还没有足够的声誉,因为我对 Whosebug 社区还是个新手)。
SCNTransaction.animationDuration = 1.0
scnView.defaultCameraController.frameNodes([node])
let newPositoin = SCNVector3(node.boundingSphere.center.x, 0, nodeShereRadius*2)
cameraNode.position = newPositoin
scnView.pointOfView = cameraNode
SCNTransaction.commit()
我有 2 个彼此相邻的 SCNView,它们应该通过不同的相机显示相同的场景。 在我看来,Scene Kit 将该节点与节点层次结构中最高的相机一起使用,所以我尝试了类似的方法
leftSceneView.scene?.rootNode.addChildNode(scene.rootNode)
rightSceneView.scene?.rootNode.addChildNode(scene.rootNode)
leftSceneView.scene?.rootNode.addChildNode(cameraNodeLeft)
rightSceneView.scene?.rootNode.addChildNode(cameraNodeRight)
但我收到了错误消息 [SCNKit ERROR] removing the root node of a scene from its scene is not allowed
,它根本不起作用。
有人建议我如何实现吗?
托比
设置视角以使用SCNView的"pointOfView"属性渲染场景。
scnView.pointOfView = cameraNodeLeft;
这个答案是关于(@WolfLink 提到的)具有多个 SCNView 对象的问题,不同的相机显示相同的 SCNScene 导致整个更新序列发生多次。
要解决此问题,您只需将 SCNSceneRendererDelegate 设置为 仅使用一个 SCNView 对象。假设代理正在处理 SCNScene 中的所有节点并相应地更新它们,其他没有分配代理的 SCNView 对象仍然能够看到所有发生的更改。这是因为更改是在所有 SCNView 对象都连接到的实际 SCNScene 中更新的。
因此,使用@Toyos 的原始答案,在不导致整个更新序列触发两次的情况下使用 2 个摄像头的方法是:
// Set up sceneView 1
sceneView1.scene = scnScene
sceneView1.pointOfView = scnScene.camera1
sceneView1.delegate = scnScene
// Set up sceneView 2
sceneView2.scene = scnScene
sceneView2.pointOfView = scnScene.camera2
(免责声明:我本来打算对@Toyos 的回答发表评论,但我目前还没有足够的声誉,因为我对 Whosebug 社区还是个新手)。
SCNTransaction.animationDuration = 1.0
scnView.defaultCameraController.frameNodes([node])
let newPositoin = SCNVector3(node.boundingSphere.center.x, 0, nodeShereRadius*2)
cameraNode.position = newPositoin
scnView.pointOfView = cameraNode
SCNTransaction.commit()