平滑插入物体方向以跟踪相机

时间:2017-12-03 04:57:40

标签: scenekit arkit

我有一个SCNNode,表示玩家在第一人称游戏中持有的物品(使用ARKit)。

我将节点作为相机的子节点,使其始终在观察者前方漂浮一小段距离。但是这个简单的设置使项目非常静态,只是粘在屏幕上。

更现实的是,如果我在我面前拿着一个物体,然后转向面向不同的方向,我的手部动作会落后于我的头部。如果我向上或向下倾斜头部,我对物体的视角也会稍微改变。

我如何在SceneKit中模拟这个?

This question对于追踪具有延迟的节点的摄像机有一些想法,并且可能反向工作。对于倾斜,也许我必须考虑加速度计,但要限制它,以便你不能过多地旋转物体。

1 个答案:

答案 0 :(得分:1)

我没有将项目作为相机的子项,而是将项目作为名为arms的新不可见节点的子项。 arms节点不是相机的子节点,但我使用SCNTransformConstraint来约束其转换,如下所示:

    // ~~ Not the final code ~~ Do not use ~~
    // Set up the viewer's "arms" to follow the camera using a dampened constraint
    arms = SCNNode()
    let armconstraint = SCNTransformConstraint.init(inWorldSpace: false) {
        (node: SCNNode, _) -> SCNMatrix4 in

        // Bind the arm's transformation to the camera's
        return self.sceneView.pointOfView!.convertTransform(SCNMatrix4Identity, to: node)
    }
    armconstraint.influenceFactor = 0.5
    arms!.constraints = [ armconstraint ]
    sceneView.scene.rootNode.addChildNode(arms!)

使用低influenceFactor的想法使arms不会严格地保持在相机前面,但会稍微延迟一下。

这样做一般;它可能明显生涩。所以我尝试将其拆分为两个单独的约束:SCNDistanceConstraint在相机和arms之间保持0的距离,SCNTransformConstraint同步arms方向但不是它的立场。

我发现虽然距离约束是完美的,但在方向上使用小数influenceFactor会导致arms发狂,在屏幕上疯狂旋转!如果是1.0,那么arms节点会严格遵循相机,但不会出现故障。

事实证明,在SCNConstraint.influenceFactor的文档中,它说:

  

此属性对SCNTransformConstraint个对象没有影响。

嗯,我想知道为什么 - 节点的transformpositionorientation是可动画的,所以看起来它们可以顺利插补而没有问题。

事实证明,有一种名为Slerp的技术是一种在四元数之间进行插值的方法。因此,不是使用influenceFactor,每次调用SCNTransformConstraint时,我都可以在arms的当前位置和相机的位置之间进行插值。这是可以接受的顺利。