而不是使物品成爲照相機的一個孩子,我做了一個名爲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