我有一个操纵角色。我可以检索骨骼节点,如果我手动对这些骨骼应用旋转,我会看到角色切换到新的姿势。
现在,如果我尝试为这个骨骼设置约束,它根本就不会移动。我尝试过反向运动学约束和简单的广告牌约束,但没办法。
以下是获取骨骼的代码:
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工作的任何方法。
答案 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]] ;
我现在可以以任何我想要的方式移动/旋转/动画我的网格。我甚至可以使用反向运动学。
结论:参考节点和节点根本不相同......