簡體   English   中英

使用 SCNIKConstraint 時,如何根據目標 position 更改設置 SCNNode 的方向轉換?

[英]How to set the orientation transformation of a SCNNode based on the target position change when using SCNIKConstraint?

我正在使用SceneKit創建人體骨架 3D animation 。 這是解釋我的節點關系的圖表:

節點關系

我將 Spine 節點設置為它上面所有節點的根節點。 我正在創建一個 animation 用於使用設備相機從運動捕捉中檢索到的數據來移動手臂。 現在,我將 Neck 設置為創建SCNIKConstraint根鏈節點,以移動手節點的 position。 我的代碼看起來很像這樣:

// The nodes to create an arm
var spineNode: SCNNode!
var neckNode: SCNNode!
var shoulderNode: SCNNode!
var elbowNode: SCNNode!
var handNode: SCNNode!

// Setting the initial positions
spineNode.position = setSpinePosition()
neckNode.position = setNeckPosition()
// and so on for the other nodes...

// Setting the constraint to the hand node
let handIkConstraint: SCNIKConstraint = .inverseKinematicsConstraint(chainRootNode: neckNode)
handNode.constraints = [handIkConstraint]

對於 position 更改,由於我使用的是從視頻的動作捕捉中檢索到的數據,因此我根據如下新數據設置了 position:

func changeFrame(data: HumanKeypointData) {
    spineNode.position = getNewPosition(data.spinePosition)
    handIkConstraint.targetPosition = data.handPosition
}

它大部分工作正常,Hand 節點按預期移動,它的父節點也是如此。 但是肩節點沒有按預期移動。 它會根據手的移動/位置變化進行旋轉,但會保持在原位。 它看起來像這樣(黑框是肩節點,你可以看到它固定在它的位置,同時它基於手節點/藍框旋轉):

肩節點不動

但我想實現這樣的事情(肩節點/黑框移動基於目標 position 使用SCNIKConstraint的手節點變化):

肩膀動了

現在也移動肩節點,我只是在新數據上設置 position,就像我對脊椎節點所做的那樣。 但是為了防止數據不准確,我想讓它根據IK約束目標position自動移動。請問有什么辦法可以實現嗎? 如果您需要更多信息,請告訴我,謝謝。

骨骼及其 IK 系統

我認為您的最佳解決方案是使用SCNSkinner 使用skinner object,可以對角色的骨骼進行逆變換初始化,綁定的皮膚中不僅實現了Parent-Child依賴,還實現了骨骼權重這樣一個重要的參數。

有關角色綁定的更多信息,請參閱為運動捕捉綁定 Model 一文。

必要的 IK 工具,在 SceneKit 中缺失

但是,上述所有操作在 SceneKit 中都是一個非常費力的過程。 最有效的方法是在 Autodesk Maya 中使用 IK/FK 為角色設置動畫,然后使用烘焙后的 animation.dae.usdz格式導出該角色。 Maya 應用程序擁有完整的 animation 種工具和可動畫屬性,用於微調反向運動學,包括IK 解算器(單鏈、旋轉平面、樣條、人體 IK、多鏈等)、效應器固定、IK/FK 切換和混合,極向量約束,MEL 和 Python 腳本。 所有這些功能在 SceneKit 中根本不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM