Картирование и связывание суставов и костей

Когда в Unity используется персонаж с мекиманами, я могу просто привязать свои сегменты устройства MoCap к костям мекимов и анимировать персонажа, так что на самом деле мне не нужно искать или искать кости мекиманов, потому что они определены и доступны через HumanBodyBones и использование Animator,

(По крайней мере, я думаю, что это так, но, пожалуйста, поправьте меня, если я ошибаюсь...)

Так, например, посредством простого процесса, который следует, я сопоставляю свои собственные сегменты анимации с персонажем-меанимом, а затем анимирую его в реальном времени с помощью моего устройства MoCap:

    private Dictionary<XsAnimationSegment, HumanBodyBones> mecanimBones;


    public enum XsAnimationSegment
    {
        Pelvis = 0,
        .
        .
        .
        Neck = 21,
        Head = 22
    }


    int[] segmentOrder =
    {
        (int)XsAnimationSegment.Pelvis,
        .
        .
        .
        (int)XsAnimationSegment.Neck,
        (int)XsAnimationSegment.Head
    };



    protected void mapMecanimBones()
    {
        mecanimBones = new Dictionary<XsAnimationSegment, HumanBodyBones>();

        mecanimBones.Add(XsAnimationSegment.Pelvis, HumanBodyBones.Hips);
        .
        .
        .
        mecanimBones.Add(XsAnimationSegment.Neck, HumanBodyBones.Neck);
        mecanimBones.Add(XsAnimationSegment.Head, HumanBodyBones.Head);
    }

Итак, я связываю сустав моей модели под названием Pelvis к механизму Единства Hips, Не нужно искать бедра и т. Д. Я даже могу получить преобразование кости, используя:

XsAnimationSegment segID = (XsAnimationSegment)segmentOrder[i];             
HumanBodyBones boneID = mecanimBones[(XsAnimationSegment)segmentOrder[i]];
Transform tmpTransf = animator.GetBoneTransform(boneID);

Теперь я пытаюсь сделать это отображение на другом скелете, и использую мое устройство MoCap для его анимации. Очевидно, я должен найти соединения и сопоставить их с моими сегментами MoCap. Итак, забудьте о mecanim сейчас, и давайте добавим Jt в начале суставов этого нового скелета, чтобы отличить его:

    private Dictionary<XsAnimationSegment, BradBodyBones> bradBones;

    public enum XsAnimationSegment
    {
        Pelvis = 0,
        .
        .
        .                        
        Neck = 21,
        Head = 22
    }


    int[] segmentOrder =
    {
        (int)XsAnimationSegment.Pelvis,
        .
        .
        .
        (int)XsAnimationSegment.Neck,
        (int)XsAnimationSegment.Head
    };


    public enum BradBodyBones
    {
        JtPelvis = 0,
        .
        .
        .
        JtSkullA = 21,
        JtSkullB = 22
    }

Теперь функция отображения и привязки, я думаю, должна выглядеть следующим образом:

    protected void mapBradBones()
    {
        bradBones = new Dictionary<XsAnimationSegment, BradBodyBones>();

        GameObject JtPelvis = this.transform.Find("ChrBrad/CharacterRoot/JtRoot/JtPelvis").gameObject;
        bradBones.Add(XsAnimationSegment.Pelvis, BradBodyBones.JtPelvis);
        .
        .
        .
        // Rest of the joints; e.g. Neck, Head, etc...
    }

Но это не делает то, что, я думаю, должно быть, потому что на более позднем этапе в моем скрипте выдается сообщение об ошибке в следующем фрагменте кода:

        for (int i = 0; i < XsSegmentCount; i++)
        {
            XsAnimationSegment segID = (XsAnimationSegment)segmentOrder[i];
            BradBodyBones boneID = bradBones[(XsAnimationSegment)segmentOrder[i]];
            try
            {
                if (boneID == BradBodyBones.JtPelvis)
                {
                    // Do something
                }
                else
                {
                    // Dos omething else
                }
            }
            catch (Exception e)
            {
                Debug.Log("Cannot find " + boneID + " in " + model.name + e);                 
                return false;
            }
        }

Буду признателен за любую помощь / совет / советы о том, как справиться с этой ситуацией.

0 ответов

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