Мне нужно прикрепить 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
}
редактировать: контрольный вопрос редактировать пожалуйста. Не удается правильно форматировать код в комментарии – Sam
Я обновил свой ответ. Я случайно связан с бета-документацией и переменными, имена которых по-разному. – Moustach
Благодаря новым именам переменных я не получаю ошибку, но функция по-прежнему не вызвана, и я не вижу «вызываемый» в консоли.Не уверен, почему его игнорируют. – Sam