SceneKit在移动相机时遇到测试错误

时间:2015-04-09 13:15:24

标签: ios swift scenekit hittest scnnode

我在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 个答案:

答案 0 :(得分:1)

我已经开始了一个新项目并一步一步地确定了什么是最热门的问题。我在官方Apple文档中的任何地方都找不到它,但我的经历如下: 如果要更改摄像机的位置或任何其他属性,可以通过将新摄像机添加到具有新位置,参数等的新节点来实现,然后设置SCNView的pointOfView属性,你可以像这样动画:

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

这里有一点重要:持有新SCNCamera的节点必须添加到SCNScene的rootView中,否则(如果你将它添加到rootView的childNode中),hittest会给你一个错误而是您触摸的SCNNode。

答案 1 :(得分:0)

看起来你正在设置另一个节点(在它上面没有连接相机)作为场景观点。

看看你的代码。要将摄像机节点附加到的节点为cameraNode,并且您正在进行观察的节点为node(您要将摄像机节点添加到其中)。