我需要将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
}
答案 0 :(得分:2)
似乎每次球接触任何东西时都会添加一个新约束,这可能会在每一帧都发生很多!
这是你应该做的:
你应该看到一个巨大的性能更新!
编辑:试试这个
func renderer(aRenderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: NSTimeInterval){
println("called")
}