如何使相机节点聚焦在点击的节点上?(SceneKit)



我创建了一个空节点,并向该空节点添加了一组节点,最后将其添加到我的根节点。之后,我创建了一个相机节点,如下所示。我正试图在我的scenekit应用程序中添加一个功能,当用户点击一个节点时,相机会移动并聚焦在该节点上。在handleTap函数中,我试图获得节点的位置,然后将相机固定到该位置,但它不起作用。有什么建议吗?

//snippet
    var emptyNode = SCNNode()
    emptyNode.addChildNode(Node)
    rootNode.addChildNode(emptyNode)
    cameraNode.camera = SCNCamera()
    cameraNode.position = SCNVector3(1,0,10)
    rootNode.addChildNode(cameraNode)

     func handleTap(recognizer: UITapGestureRecognizer) {
            let location = recognizer.locationInView(sceneView)
            let hits = sceneView!.hitTest(location, options: nil)
            if let tap = hits.first?.node {
                tappNode = tap
                myScene?.cameraNode.position = tappNode.position
            }

编辑

所以,我正在取得一点进展,但我仍然无法弄清楚我的节点的位置。更新后的代码如下所示。我所做的是创建一个新节点,并在其上附加一个相机。然后,该节点作为子节点添加到tap节点。我仍然无法在空节点的上下文中获得抽头节点的位置。

let cameraNode = SCNNode()
cameraNode.name = "cameraNode"
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3Make(1,0,10)

tappNode.addChildNode(cameraNode)

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(3.0)
SCNTransaction.setCompletionBlock() {
    print("done")
}
sceneView!.pointOfView = cameraNode
SCNTransaction.commit()

当您将相机节点移动到被点击节点(或在被点击节点创建新相机(时,您几乎不可能从该相机中看到被点击节点。

怎么样

let lookAtConstraint = SCNLookAtConstraint.init(tappNode)
sceneView!.pointOfView.constraints = [lookAtConstraint]

保留对lookAtConstraint的引用,以便在后续抽头中更改其target

在我自己的应用程序中,我有一个"默认"的SCNNode,我在启动时定义它,例如

defaultPoint

通过双击,用户重置到这个观点,简单地说就是

scnView.pointOfView=self-defaultPoint

其中scnView是包含所有节点的主scnView。在您的情况下,我想您必须通过反复尝试来定义一个或多个特定于节点的视点节点(这些节点显然与节点本身没有相同的坐标(,然后相应地设置场景视点。

PS我的主SCNView已将allowsCameraControl设置为true。

最新更新