2017-12-03 72 views
1

我有一個SCNNode表示玩家在第一人稱遊戲中使用的物品(使用ARKit)。物體方向的光滑插值跟蹤相機

我將節點製作爲攝像機的子節點,以便它總是在觀看者的前方漂浮很短的距離。但是這個簡單的設置使得物品非常靜止,只是粘在屏幕上。

更爲現實的是,如果我在我面前拿着一個物體,然後轉向另一個方向,我的手部運動會滯後我的頭部。如果我把頭向上或向下傾斜,我對物體的視角也會略有變化。

我怎麼能在SceneKit中模擬這個?

This question對於延遲追逐節點並且可能反向工作的攝像機有一些想法。對於傾斜,也許我不得不考慮加速度計,但限制它,以便您不能太多地旋轉對象。

回答

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對象沒有影響。

咦,我不知道爲什麼,一個節點的transformposition,並orientation是動畫看起來是這樣的,他們能順利插值沒有問題。

原來有一種叫做Slerp的技術,它是一種在四元數之間插值的方法。因此,而不是使用influenceFactor,每次調用我的SCNTransformConstraint時,我都可以在當前位置arms和相機的位置之間進行插值。這是可以接受的順利。

+0

不是一個壞主意。請注意,在iOS 11中,還有更多'SCNConstraint'類型,因此您可以通過鏈接複製器,加速和距離約束來完成更多工作,而不必自己編寫transform-matrix-munging塊。 (我更新了與更多細節/示例鏈接的問題。) – rickster

+0

我的假設是,匆忙是由於四捨五入錯誤,或者是因爲ARKit不斷重新計算基於新數據的場景內攝像機的位置。 我試着用'SCNDistanceConstraint'把'arms'對象與相機保持0的距離。這工作得很好,但它不保持同步旋轉。 – rgov

+0

噢。這是一個比我期待的影響更大的影響,但我用真正的解決方案更新了我的答案。 – rgov