我有一个SCNNode,表示玩家在第一人称游戏中持有的物品(使用ARKit)。
我将节点作为相机的子节点,使其始终在观察者前方漂浮一小段距离。但是这个简单的设置使项目非常静态,只是粘在屏幕上。
更现实的是,如果我在我面前拿着一个物体,然后转向面向不同的方向,我的手部动作会落后于我的头部。如果我向上或向下倾斜头部,我对物体的视角也会稍微改变。
我如何在SceneKit中模拟这个?
This question对于追踪具有延迟的节点的摄像机有一些想法,并且可能反向工作。对于倾斜,也许我必须考虑加速度计,但要限制它,以便你不能过多地旋转物体。
答案 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
个对象没有影响。
嗯,我想知道为什么 - 节点的transform
,position
和orientation
是可动画的,所以看起来它们可以顺利插补而没有问题。
事实证明,有一种名为Slerp的技术是一种在四元数之间进行插值的方法。因此,不是使用influenceFactor
,每次调用SCNTransformConstraint
时,我都可以在arms
的当前位置和相机的位置之间进行插值。这是可以接受的顺利。