Как ограничения 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) ;
Я получаю этот результат, показывая, что голова вращается правильно
Если я сделаю это вместо этого:
SCNBillboardConstraint *constraint3 = [SCNBillboardConstraint billboardConstraint] ;
headBone.constraints = @[constraint3] ;
Голова остается прямой, когда она должна следовать за камерой.
Ограничения рекламного щита работают очень хорошо, если я просто добавляю их в узел "Box", но я не мог найти способ заставить его работать с моими несвязными костями... И я не мог найти способ сделать 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]] ;
И теперь я могу перемещать / вращать / анимацию моего меша любым способом, каким я захочу. У меня даже была обратная кинематика.
Вывод: ссылочные узлы и узлы совсем не совпадают...