1

我在初始化时这样声明我的相机:

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

任何人都可以帮我解决这个问题吗?谢谢

4

2 回答 2

1

我已经开始了一个新项目,并一步一步地弄清楚了 hittest 何时出错。我在 Apple 官方文档中没有找到它,但我的经验如下:如果要更改相机的位置或任何其他属性,可以通过将新相机添加到具有新位置的新节点来实现,参数等,然后你设置 SCNView 的 pointOfView 属性,你可以像这样动画:

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

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

于 2015-04-14T07:58:08.603 回答
0

看起来您正在将另一个节点(在该节点上没有附加相机)设置为场景视点。

看看你的代码。您将相机节点附加到的节点是cameraNode,并且您正在制作视点的节点是node(您要添加相机节点的节点)。

于 2015-04-09T14:25:11.750 回答