物体方向的光滑插值跟踪相机
我有一个SCNNode表示玩家在第一人称游戏中使用的物品(使用ARKit)。物体方向的光滑插值跟踪相机
我将节点制作为摄像机的子节点,以便它总是在观看者的前方漂浮很短的距离。但是这个简单的设置使得物品非常静止,只是粘在屏幕上。
更为现实的是,如果我在我面前拿着一个物体,然后转向另一个方向,我的手部运动会滞后我的头部。如果我把头向上或向下倾斜,我对物体的视角也会略有变化。
我怎么能在SceneKit中模拟这个?
This question对于延迟追逐节点并且可能反向工作的摄像机有一些想法。对于倾斜,也许我不得不考虑加速度计,但限制它,以便您不能太多地旋转对象。
而不是使物品成为照相机的一个孩子,我做了一个名为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
对象没有影响。
咦,我不知道为什么,一个节点的transform
,position
,并orientation
是动画看起来是这样的,他们能顺利插值没有问题。
原来有一种叫做Slerp的技术,它是一种在四元数之间插值的方法。因此,而不是使用influenceFactor
,每次调用我的SCNTransformConstraint
时,我都可以在当前位置arms
和相机的位置之间进行插值。这是可以接受的顺利。
不是一个坏主意。请注意,在iOS 11中,还有更多'SCNConstraint'类型,因此您可以通过链接复制器,加速和距离约束来完成更多工作,而不必自己编写transform-matrix-munging块。 (我更新了与更多细节/示例链接的问题。) – rickster
我的假设是,匆忙是由于四舍五入错误,或者是因为ARKit不断重新计算基于新数据的场景内摄像机的位置。 我试着用'SCNDistanceConstraint'把'arms'对象与相机保持0的距离。这工作得很好,但它不保持同步旋转。 – rgov
噢。这是一个比我期待的影响更大的影响,但我用真正的解决方案更新了我的答案。 – rgov