SceneKit约束如何与骨骼一起使用?

时间:2017-04-09 15:49:35

标签: macos cocoa scenekit inverse-kinematics

我有一个操纵角色。我可以检索骨骼节点,如果我手动对这些骨骼应用旋转,我会看到角色切换到新的姿势。

现在,如果我尝试为这个骨骼设置约束,它根本就不会移动。我尝试过反向运动学约束和简单的广告牌约束,但没办法。

以下是获取骨骼的代码:

SCNNode *man = [scene.rootNode childNodeWithName:@"Man" recursively:YES] ;
SCNNode *bodyOfMan = [man childNodeWithName:@"Body" recursively:YES] ;
SCNNode *bodyRealSkeleton = bodyOfMan.skinner.skeleton ;
SCNNode *headBone = [bodyRealSkeleton childNodeWithName:@"mixamorig_Head" recursively:YES] ;

如果我这样做:

headBone.rotation   = SCNVector4Make(0,1,0,45) ;

我得到这个结果,显示头部正确旋转

enter image description here

如果我改为:

SCNBillboardConstraint  *constraint3 = [SCNBillboardConstraint billboardConstraint] ;
headBone.constraints    = @[constraint3] ;

当它应该跟随相机时,头部保持笔直向前。

如果我将广告牌限制添加到" Box"节点,但我找不到任何方法让它对我操纵的网状骨骼起作用...... 而且我根本无法找到使SCNIKConstraint工作的任何方法。

1 个答案:

答案 0 :(得分:1)

我发现问题的根本原因是什么。

我已经在XCode中将man mesh添加到场景中,这会创建一个SCNReferenceNode。出于某种原因,您无法将“引用节点”作为任何其他节点移动/旋转/动画。

我甚至无法将其“加载”布尔值设为true,尽管网格显然出现在我的视图中。

所以我所做的是从.scn文件中删除引用,并在我的场景中以编程方式加载网格(“ManPivot”只是我在.scn文件中引入的一个枢轴节点,我想要包含我的网格):

SCNScene    *manScene   = [SCNScene sceneNamed:@"art.scnassets/Man.dae"] ;
manScene.rootNode.name  = @"Man" ;
SCNNode     *manPivot = [scene.rootNode childNodeWithName:@"ManPivot" recursively:YES] ;
[manPivot addChildNode:[manScene.rootNode clone]] ;

我现在可以以任何我想要的方式移动/旋转/动画我的网格。我甚至可以使用反向运动学。

结论:参考节点和节点根本不相同......