2015-07-17 6 views
1

Мне нужно прикрепить SCNCamera к SCNNode, чтобы всякий раз, когда узел (шарик) перемещается, камера следует за ним.Камера третьего лица в SceneKit

До сих пор мне удалось это сделать, постоянно перемещая камеру, когда физика обновляется, но она не очень эффективна и имеет некоторую задержку.

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, которые могут «прикрепить» камеру к узлу, но я не нашел рабочий пример.

Я не могу просто прикрепить камеру к узлу, поскольку я хочу отрегулировать положение камеры.

Спасибо.

Edit: (Для Moustach)

Я пытался сделать это с помощью:

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

, но я получаю сообщение об ошибке сказав: Extraneous '_' in parameter: 'rendered' has no keyword argument name

Edit 2 (рабочий):

С советом Мустаха мы смогли сделать эту работу эффективно.

Положение камеры теперь обновляется:

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 
} 

ответ

2

Кажется, вы добавляете новое ограничение каждый раз, когда мяч касается что угодно, что, вероятно, случается много в каждом кадре!

Вот что вы должны сделать:

  • Подведите создание ограничения где-то это будет только установить один раз, как, например инициализации
  • Переместить обновление кода позиции в renderer delegate так, чтобы она только дозвонилась после кадра, сразу после вычисления физики.

Вы должны увидеть огромное обновление производительности!

Edit: попробуйте этот

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

редактировать: контрольный вопрос редактировать пожалуйста. Не удается правильно форматировать код в комментарии – Sam

+0

Я обновил свой ответ. Я случайно связан с бета-документацией и переменными, имена которых по-разному. – Moustach

+0

Благодаря новым именам переменных я не получаю ошибку, но функция по-прежнему не вызвана, и я не вижу «вызываемый» в консоли.Не уверен, почему его игнорируют. – Sam

Смежные вопросы