Как ограничения 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]] ;

И теперь я могу перемещать / вращать / анимацию моего меша любым способом, каким я захочу. У меня даже была обратная кинематика.

Вывод: ссылочные узлы и узлы совсем не совпадают...

Другие вопросы по тегам