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

How does SceneKit constraints work with bones?

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

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

这是获取骨骼的代码:

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) ;

我得到这个结果,表明头部旋转正常

如果我改为这样做:

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

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

如果我只是将它添加到 "Box" 节点,广告牌约束效果很好,但我找不到任何方法让它适用于我的装配网格骨骼... 而且我根本找不到任何方法让 SCNIKConstraint 工作。

我找到了问题的根本原因。

我在 XCode 中的场景中添加了人形网格,它创建了一个 SCNReferenceNode。出于某种原因,您不能像任何其他节点那样 move/rotate/animation "reference node"。

我什至无法将其 "loaded" 布尔值设为真,尽管网格显然出现在我的视野中。

所以我所做的是从 .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]] ;

我现在可以 move/rotate/animation 我的网格以任何我想要的方式。我什至有逆向运动学工作。

结论:参考节点和节点根本不一样...