Skip to main content

VRM-Animation export

BVH Converter 実装を参照してください。

  • menu - VRM1 - Experimental - Convert BVH to VRM-Animation...

Assets/VRM10/Editor/VrmAnimationMenu.cs

説明

入力

VrmAnimation を出力するには以下が必要です。

  • humanoid のGameObject hierarchy.
  • himanoid ヒエラルキーが T-Pose になっていること。
  • 時間毎に humanoid ヒエラルキーのポーズが変わること。

以上の条件を簡単に満たすために bvh を利用しています。

warning

初期姿勢が T-Pose でない BVH は動作しません

Unity humanoid は必須ではありません

Animator.GetBoneTransform を使うのが簡単です。

初期化

VRM Animation exporter 使用手順
Transform humanoid_hierarchy;

var data = new ExportingGltfData();
using var exporter = new VrmAnimationExporter(
data, new GltfExportSettings());
exporter.Prepare(humanoid_hierarchy.gameObject);
VRM Animation exporter 使用手順
exporter.Export((VrmAnimationExporter vrma) =>
{
// get human bones
var map = new Dictionary<HumanBodyBones, Transform>();
var animator = bvh.Root.GetComponent<Animator>();
foreach (HumanBodyBones bone in Enum.GetValues(typeof(HumanBodyBones)))
{
if (bone == HumanBodyBones.LastBone)
{
continue;
}
var t = animator.GetBoneTransform(bone);
if (t == null)
{
continue;
}
map.Add(bone, t);
}

vrma.SetPositionBoneAndParent(map[HumanBodyBones.Hips], bvh.Root.transform);

foreach (var kv in map)
{
var vrmBone = Vrm10HumanoidBoneSpecification.ConvertFromUnityBone(kv.Key);
var parent = GetParentBone(map, vrmBone) ?? bvh.Root.transform;
vrma.AddRotationBoneAndParent(kv.Key, kv.Value, parent);
}

時間を進めてフレームを登録する


// get animation
var animation = bvh.Root.gameObject.GetComponent<Animation>();
var clip = animation.clip;
var state = animation[clip.name];

var time = default(TimeSpan);
for (int i = 0; i < bvh.Bvh.FrameCount; ++i, time += bvh.Bvh.FrameTime)
{
state.time = (float)time.TotalSeconds;
animation.Sample();
vrma.AddFrame(time);
}

出力

});
var glb = data.ToGlbBytes();
tip

通常の glb に VRMC_vrm_animation が追加されたものです。