見出し画像

VCIで人型モデルを躍らせたかった

VCI?

https://virtualcast.jp/wiki/vci/top
上記より引用

VCI(Virtual Cast Interactive)とは、バーチャルキャスト内で使用可能なアイテムのことです。VCIを使ってアバター用の小物を作ったり、背景をカスタマイズすることができます。

概要

前述のVCIで人型アバターを躍らせたかったんですが、色々上手くいかなかったので、上手くいった点と上手くいかなかった点を書きます。

理解不足などによる誤情報が含まれる可能性があります。正しい情報をお持ちの方が居られましたらご指摘頂けますと幸いです。

やりたかったこと

VRMを読み込むと、読み込んだVRMのアバターモデルが、ユニティちゃんのCRS(UNITE IN THE SKY)を踊ってくれるVCIを作成するツールが作りたかった……。VCIを作成するツール自体は何種類か作っていたので、元になるVCIが出来れば作れると思ってました。

上手くいった点

UniVCIとUniVRMの共存
前述のツールを作るには、この共存が必要です。一時期は特に対策しなくても共存出来た時期(バージョン)があった気がするんですが、いつ頃からか素直には共存できなくなってしまいました。今回は以下の組み合わせと方法で共存確認しました。
Unity 2019.4.25f1 + UniVCI-0.31.1 + UniVRM-0.66.0
1. UniVRMを先にインポート
2. UniVCIを後にnewのみインポート(new以外のチェックを外す)
※逆は未確認

アニメーションのGeneric化
CRS(UNITE IN THE SKY)のモーションは「C86unitychan_003_NOT01_Final.fbx」を使いました。もともとRigのAnimationTypeが選べるので、GenericにしてAnimationClipを取り出せばGeneric化は出来ました。ただし、ユニティちゃんモデルに対してのオブジェクト構造になります。

Luaによるリターゲット
Generic化したのはユニティちゃんモデルとしてなので、メッシュを削除したオブジェクト構造のみのユニティちゃんモデルをダミーとして用意します。あとは、Humanoidに対応するようにLuaでリターゲットすることで、少しズレてましたが、対象モデルに対して汎用的なアニメーション方法になったように思います。以下は分かりやすいように、ユニティちゃんモデルを半透明にした動確映像です。

曲との合わせ
これは単純な話です。前述までは出来たので曲を付けてみたら合ってなかったので、曲の最初に無音を2秒入れて合わせました。幸いにしてアニメーションの方が遅かったので、無音挿入で済みました。

上手くいかなかった点

アニメーションを含むVCIのランタイム生成
これが致命的でした。UniVCIのExportを見るにおそらくUnityEditorに依存した出力処理になっているように思われました。アニメーションを含む場合のランタイム出力は出来ないようです。
以下は「.\VCI\UniVCI\Scripts\IO\VCIExporter.cs」のVCIExporter.Exportより引用です。

#if UNITY_EDITOR
           // Animation
           // None RootAnimation
           var animators = exporter.Copy.GetComponentsInChildren<Animator>().Where(x => exporter.Copy != x.gameObject);
           var animations = exporter.Copy.GetComponentsInChildren<Animation>().Where(x => exporter.Copy != x.gameObject);
           // NodeIndex to AnimationClips
           Dictionary<int, AnimationClip[]> animationNodeList = new Dictionary<int, AnimationClip[]>();

なお、EditorでAnimationClipをAnimationではなくAnimatorで持っていても、エクスポートしたVCIをインポートすると、AnimationとしてAnimationClipを保持していました。エクスポート時にこうなるのか、インポート時になるのか、までは確かめていませんが、なんとなくエクスポート時にはすでにこうなっていそうな気がします。また、glbのタグを辿ってバイナリを書き換える。とかすれば出来るのかもしれませんが、私にはハードルが高いです。

ランタイム生成は諦めて手順記事を書こうと、簡単な手順が無いか調べてみたんですが、結局上手くいかなかったので、それも書きます。

Humanoidのアニメーションを含むVCIの作成
Humanoidのアニメーションを含むVCIは、作成できませんでした。厳密には作成は出来ますが、アニメーションが再生されませんでした。さらに言うと、再生はされているのかもしれませんが、前述したAnimatorがAnimationになる点で、恐らくHumanoidのリターゲット情報が失われHumanoidのアニメーションが適用されなくなるのだと思われます。

FbxExporterによるGeneric化
Luaリターゲットは面倒なので、対象モデルに対して直接Generic化できないかと考え、アニメーションを含んだFBXとして対象モデルをFbxExporterで出力し、RigをGenericにしたらGeneric化できないかと試したのですが、ダメでした。

UnityRecorderによるGeneric化
目的は前述と同じです。そしてこの方法は、未確認ですが恐らく、「出来る」「出来ない」で言えば「出来る」ハズです。ただし、対象モデルをVRMとして取り込み、そのままUnityRecorderでAnimationClipを作成しようとすると、全オブジェクトの変化を記録するので、短いモーションなら良いですが、数分のモーションだと保存処理が終わりません。試しに開始数秒だけで止めたらちゃんと終わりました。揺れ物を削除すれば良いのかもしれませんが、それはそれで面倒だし……

まとめ

雑に要点だけ愚痴ると、ランタイム出力が不可なのとHumanoidが使えないという2点が難点でした。「VCIを使ってアバター用の小物」と言っているわけですから、人型を想定はしていないのでしょうし、人型はVRMがあるだろ、という話なのだと思います。

案としては、最低限のオブジェクト構造(ボーン構造)を持つダミーアバターを用意して、コレ経由でHumanoidをUnityRecorderでGeneric化、Lua内でリターゲットという方法を考えましたが、色々課題(面倒)がありそうです。どちらにせよランタイム出力が不可なのは、どうにもなりませんしね。

CRS(UNITE IN THE SKY)のアニメーションをVCIに使っていた方は居るので、その方たちがどのようにして対応したのかは知りたいですが、聞く勇気がないので、ここでぼやいておきます。

おまけ

せっかく作ったのでバーチャルキャストのルームで見れるようにしました。

この記事が気に入ったらサポートをしてみませんか?