如何让我的摄像机节点专注于分接节点? (SceneKit)

时间:2016-08-05 20:13:18

标签: swift scenekit scnnode

我创建了一个空节点,并向空节点添加了一组节点,最后将其添加到我的根节点。之后,我创建了一个摄像头节点,如下所示。我正在尝试向我的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节点。我仍然无法在空节点的上下文中获取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()

2 个答案:

答案 0 :(得分:1)

将摄像机节点移动到分接节点(或在分接节点处创建新摄像机)时,几乎无法从该摄像机看到分接节点。

怎么样

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

保留对lookAtConstraint的引用,以便您可以在后续点按时更改其target

答案 1 :(得分:0)

在我自己的应用程序中,我有一个“默认”观点作为SCNNode,我在启动时定义,例如。

defaultPoint

通过双击,用户可以重置到这个角度,只需这样

scnView.pointOfView = self.defaultPoint

其中scnView是包含所有节点的主要SCNView。在你的情况下,我猜你必须通过反复试验来定义一个或多个特定于节点的视点节点(显然它们与节点本身没有相同的坐标),然后设置场景视图相应的观点。

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