SceneKit

时间:2015-07-17 13:03:53

标签: ios swift camera scenekit scnnode

我需要将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的信息,这些信息可以"附加"相机到节点,但我没有找到工作的例子。

我无法将相机连接到节点,因为我想调整相机的位置。

感谢。

编辑:(致Moustach)

我尝试使用:

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

但我收到错误消息:Extraneous '_' in parameter: 'rendered' has no keyword argument name

编辑2(工作):

根据Moustach的建议,我们能够有效地完成这项工作。

相机位置现已更新:

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

此外,新的SCNNode被创建为摄像机节点的rootNode以保持其位置。

现在设置相机如下:

        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
}

1 个答案:

答案 0 :(得分:2)

似乎每次球接触任何东西时都会添加一个新约束,这可能会在每一帧都发生很多!

这是你应该做的:

  • 将约束创建移动到仅设置一次的位置,例如init
  • 将位置更新代码移至renderer delegate,以便只在物理计算完毕后才会调用一次。

你应该看到一个巨大的性能更新!

编辑:试试这个

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