【问题标题】:Smooth interpolation of object orientation to track the camera物体方向的平滑插值以跟踪相机
【发布时间】:2018-05-16 20:36:24
【问题描述】:

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

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

更现实地说,如果我拿着一个物体在我面前,然后转身面对不同的方向,我的手部动作会稍微落后于我的头。如果我向上或向下倾斜我的头,我对物体的看法也会发生轻微的变化。

如何在 SceneKit 中进行模拟?

This question 对摄像机有一些想法,该摄像机可以延迟追逐节点,并且可能会反过来工作。对于倾斜,也许我必须考虑加速度计,但要限制它,这样你就不能过度旋转物体。

【问题讨论】:

    标签: scenekit arkit


    【解决方案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 方向但不同步其位置。

    我发现虽然 distance 约束完美无缺,但在方向上使用分数 influenceFactor 会导致 arms 发狂,在屏幕上疯狂旋转!如果是1.0,则arms 节点会严格地跟随相机,但不会出现故障。

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

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

    嗯,我想知道为什么 - 一个节点的 transformpositionorientation 是可动画的,所以看起来它们可以平滑地插值没有问题。

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

    【讨论】:

    • 不错的主意。请注意,在 iOS 11 中,有更多 SCNConstraint 类型,因此您可以通过链接复制器、加速和距离约束来完成更多工作,而不是自己编写变换矩阵修改块。 (我用更多详细信息/示例更新了您链接到的问题。)
    • 我的假设是抖动要么是由于舍入误差,要么是因为 ARKit 不断根据新数据重新计算场景中相机的位置。我尝试使用SCNDistanceConstraintarms 对象与相机相距0。这很好用,但它也不能保持旋转同步。
    • 哇。这比我预期的更复杂,但我用真正的解决方案更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多