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