2017-04-09 110 views
0

我有一个操纵角色。我可以检索骨骼节点,如果我手动将旋转应用到这些骨骼,我会看到角色切换到新的姿势。SceneKit约束如何与骨骼一起使用?

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

下面是代码,以获得骨:

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

当它应该跟在相机上时,头部会保持直线前进。

如果我只是将它添加到“盒子”节点,但是我找不到任何方式使它对我的装配好的网格骨骼起作用,广告牌约束就能很好地工作...... 而且我找不到任何完全可以使SCNIKConstraint工作。

回答

1

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

我已经添加了网格到XCode中的场景,它创建了一个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]] ; 

而且我现在可以以任何我想要的方式移动/旋转/动画我的网格。我甚至有反向运动学的工作。

结论:参考节点和节点是不一样的...