2

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

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

这是获取骨骼的代码:

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

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

如果我只是将广告牌约束添加到“盒子”节点,它会很好地工作,但我找不到任何方法让它适用于我的装配网格骨骼......而且我找不到任何方法来制作 SCNIKConstraint工作,在所有。

4

1 回答 1

2

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

我在 XCode 中将 man 网格添加到场景中,这会创建一个 SCNReferenceNode。出于某种原因,您不能像任何其他节点一样真正移动/旋转/动画该“参考节点”。

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

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

我现在可以以任何我想要的方式移动/旋转/动画我的网格。我什至有逆运动学工作。

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

于 2017-04-11T11:37:51.650 回答