繁体   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