SceneKit попала в тестовую ошибку при перемещении камеры

Я объявляю мою камеру в init:

defaultCameraNode.camera = SCNCamera()
defaultCameraNode.position = SCNVector3Make(0, 200, 500)
defaultCameraNode.camera?.zFar = 1000.0
defaultCameraNode.camera?.zNear = 10.0
defaultCameraNode.camera?.xFov = 30.0
defaultCameraNode.camera?.yFov = 30.0
scene.rootNode.addChildNode(defaultCameraNode)
sceneView.pointOfView = defaultCameraNode
defaultCameraNode.constraints = [SCNLookAtConstraint(target: rootNode)]

После этого в блоке tapGesture я делаю тест на попадание:

let hitResults = sceneView.hitTest(sender.locationInView(sceneView), options: nil)

Это возвращает то, что я хочу, получил узел. После того, как я добавляю новую камеру и меняю точку зрения сцены

var cameraNode = SCNNode()
cameraNode.name = "cameraNode"
cameraNode.position = SCNVector3Make(position.x, position.y + 50.0, position.z + Float(radius * 3))
cameraNode.rotation = SCNVector4Make(1, 0, 0, -atan2f(20.0, 40.0))

var camera = SCNCamera()
camera.zNear = 0.0
camera.zFar = 1000.0
camera.xFov = 40.0
camera.yFov = 40.0
cameraNode.camera = camera    
node.addChildNode(cameraNode)

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(animationDuration)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()

Когда положение камеры изменяется, тот же самый тест попадания, который я использовал ранее, возвращает массив длины 0 и получает эту ошибку на консоли:

SceneKit: error, error in _C3DUnProjectPoints

Кто-нибудь может помочь мне решить это? Спасибо

2 ответа

Решение

Я запустил новый проект и понял его шаг за шагом, когда хит-пойдёт не так. Я не нашел этого нигде в официальной документации Apple, но мой опыт заключается в следующем: если вы хотите изменить положение камеры или любое другое свойство, вы можете сделать это, добавив новую камеру в новый узел с новой позицией, параметры и т. д. затем вы устанавливаете свойство pointOfView в SCNView, вы можете сделать это анимировано так:

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2.0)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()

Здесь один важный момент: узел, содержащий новую SCNCamera, должен быть добавлен в rootView SCNScene, иначе (если вы добавите его в childNode rootView), хит-тест выдаст вам ошибку вместо SCNNode, к которому вы прикоснулись.

Похоже, что вы устанавливаете другой узел (к которому не подключена камера) в качестве сцены.

Посмотри на свой код. Узел, к которому вы присоединяете узел камеры, cameraNodeи узел, который вы делаете точку зрения node (к которому вы добавляете узел камеры).

Другие вопросы по тегам