Картирование и связывание суставов и костей
Когда в 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;
}
}
Буду признателен за любую помощь / совет / советы о том, как справиться с этой ситуацией.