Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SceneKit中的第三人称摄影机_Ios_Swift_Camera_Scenekit_Scnnode - Fatal编程技术网

Ios SceneKit中的第三人称摄影机

Ios SceneKit中的第三人称摄影机,ios,swift,camera,scenekit,scnnode,Ios,Swift,Camera,Scenekit,Scnnode,我需要将SCNCamera附加到SCNNode上,这样每当节点(球)移动时,相机都会跟随它 到目前为止,我通过在物理更新时不断移动相机来做到这一点,但它不是很有效,而且有一些延迟 func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) { var cameraP = SCNVector3(x: ball.presentationNode().posi

我需要将
SCNCamera
附加到
SCNNode
上,这样每当节点(球)移动时,相机都会跟随它

到目前为止,我通过在物理更新时不断移动相机来做到这一点,但它不是很有效,而且有一些延迟

    func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact)
    {
        var cameraP = SCNVector3(x: ball.presentationNode().position.x, y: ball.presentationNode().position.y + 5, z: ball.presentationNode().position.z + 12)
        camera.constraints = nil
        camera.position = cameraP
        camera.constraints = [SCNLookAtConstraint(target: ball)]
    }
我阅读了一些关于
SCNTransformationConstraint
的信息,这些信息可以将相机“附加”到节点上,但我没有找到工作示例

我不能只将相机连接到节点,因为我要调整相机的位置

谢谢

编辑:(到小胡子)

我试着用以下方法做到这一点:

optional func renderer(_ renderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval)
{
    println("called")
}
但是我得到一个错误,在参数中说:
externous'.'rendered'没有关键字参数名

编辑2(工作):

在moutach的建议下,我们能够有效地完成这项工作

相机位置现在更新为:

func renderer(aRenderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval)
{
    println("called")
}
此外,还创建了一个新的
SCNNode
,作为摄影机节点的根节点以保持其位置

现在设置摄影机的方式如下所示:

        let lookAtBallConstraint = SCNLookAtConstraint(target: ball)
        lookAtBallConstraint.gimbalLockEnabled = true

        let tempCam = SCNCamera()
        tempCam.zFar = 5000
        camera = SCNNode()
        camera.camera = tempCam
        camera.position = SCNVector3(x: 0, y: 0, z: 0)
        camera.constraints = [lookAtBallConstraint]

        cameraPosition = SCNNode()
        cameraPosition.position = SCNVector3(x: 0, y: 5, z: 12)
        cameraPosition.addChildNode(camera)
func renderer(aRenderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval)
{
    var cameraP = SCNVector3(x: ball.presentationNode().position.x, y: ball.presentationNode().position.y + 5, z: ball.presentationNode().position.z + 12)
    cameraPosition.position = cameraP
}
现在摄像机移动功能如下所示:

        let lookAtBallConstraint = SCNLookAtConstraint(target: ball)
        lookAtBallConstraint.gimbalLockEnabled = true

        let tempCam = SCNCamera()
        tempCam.zFar = 5000
        camera = SCNNode()
        camera.camera = tempCam
        camera.position = SCNVector3(x: 0, y: 0, z: 0)
        camera.constraints = [lookAtBallConstraint]

        cameraPosition = SCNNode()
        cameraPosition.position = SCNVector3(x: 0, y: 5, z: 12)
        cameraPosition.addChildNode(camera)
func renderer(aRenderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval)
{
    var cameraP = SCNVector3(x: ball.presentationNode().position.x, y: ball.presentationNode().position.y + 5, z: ball.presentationNode().position.z + 12)
    cameraPosition.position = cameraP
}

似乎每次球碰到任何东西时都会添加一个新的约束,这可能在每一帧都会发生

以下是您应该做的:

  • 将约束创建移动到只设置一次的位置,例如init
  • 将位置更新代码移动到,以便在物理计算完成后,一帧只调用一次
你应该看到一个巨大的性能更新

编辑:试试这个

func renderer(aRenderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval){
    println("called")
}

编辑:请勾选问题编辑。无法在注释中正确设置代码格式我更新了答案。我意外地链接到beta文档和不同名称的变量。由于新的变量名,我没有得到错误,但函数仍然没有被调用,我也没有在控制台中看到“调用”。不知道为什么会被忽略。你把代码放在哪里了?它需要与
SCNSceneRendererDelegate
兼容。你可以在这里看到一个例子:让我们。