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
兼容。你可以在这里看到一个例子:让我们。