🤖

VRM1におけるSpringBoneのランタイム変更

2024/12/05に公開

はじめに

皆さんこんにちは、ambrでクライアントエンジニアをしているサックーです!
この記事は ambr, Inc. Advent Calendar 2024 5日目の記事です。
今回はUnity上でVRM1を扱う時のちょっとしたTipsになります。

課題

弊社で開発しているバーチャル体験プラットフォーム「xambr」(ちなみに"クロスアンバー"と読みます)では、VRoid HubのVRMをアバターとして使えるようになっています。
そのための機能を提供してくれるVRoid SDKにおいては、標準でVRM1対応がなされていたのでそのままVRM1を扱うこととしています。

そこで問題になったのはVRMに設定されたSpringBoneの調整です。
特に移動時に激しく揺れすぎてしまう問題の抑制のために、centerというプロパティを操作したかったのですが、ランタイムの読み込み時に変更しても一切反映されず困っていました。

centerの解説は、以下の公式ドキュメントを参照してください。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_springBone-1.0/README.ja.md#center-space

解決法

結果としては、変更した後にVrm10Runtime.ReconstructSpringBone()を呼ぶことで解決しました。

仮にすべてのSpringBoneのCenterにRootを設定する場合、以下のようなコードになります。

Vrm10Instance instance = vrmObject.GetComponent<Vrm10Instance>();
Vrm10Runtime runtime = instance.Runtime;

// SpringBoneの暴れを抑えるため、SpringBoneのCenterをRootに設定
List<Vrm10InstanceSpringBone.Spring> springBones = instance.SpringBone?.Springs;

if (springBones != null)
{
    for (int i = 0; i < springBones.Count; i++)
    {
        Vrm10InstanceSpringBone.Spring spring = springBones[i];
        spring.Center = vrmObject.transform;
    }
    // 変更を反映するためこの関数を呼ぶ
    runtime.ReconstructSpringBone();
}

これによりRootごと移動するような場合に、SpringBoneが暴れてしまうことが無くなりました!
今回はcenterのみを操作しましたが、他の項目でも同様にこれで反映が可能です。

VRM1はまだまだ情報が少ない点もありますが、少しずつでも知見が蓄積されていくといいなと思っています…!

ambr Tech Blog

Discussion