如何在 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()