UnityとHTC VIVEでバーチャルアイドルに変身(ATL客員研究員寄稿記事)


ATL客員研究員登録させてもらってます@UUUPAと申します。2017年末から現在にかけて、バーチャルYouTuberやVRChatが話題沸騰ですね。私も以下を目標に実装の勉強をしました。

  • キズナアイさん(©Kizuna AI)の3Dモデルを使用させていただいて良いようですので、キズナアイさんに変身する
  • HTC VIVEのHMD(頭)とコントローラー(両手)の計3点をトラッキングして、モデルの動きに反映させる
  • 動きを自然に見せるためにFinal IK(Unityの有料アセット)を使う
  • VR空間では、自分の目の前に鏡を立てて、それに映る自分を眺める
  • 3Dモデルの顔の表情、視線、手指も操作できるようにする

結果として、上の目標は実装できて、以下の通りとなりました。


ツイートの通り、学習内容の大半は、既存のVR開発者様の記事に倣ったものです。私はUnityの達人ではないため、先達の皆様の記事に沿って実装を進めていくにあたり、ちょっと躓いた箇所を本記事で書きとどめておこうと思います。Unityのバージョンは2017.3を利用しています。

1. キズナアイさんをUnity上で動かす

こちらの手順は、@halne369様の

Unity+Vive+MMD+VRIKで、キズナアイちゃんになりきりVR

の記事の通り作業を進めました。
Final IKは$90の有料アセットですが、ネットで関連記事を見回ったところ、VRで3Dキャラのモーション演出にはIK(インバースキネマティクス)を活用したほうがよく、Unity上でIKを実装する方法はいくつかあるものの、高品質なFinal IKの使用事例が多かったので、私も購入しました。

実装において、halne369様の記事と異なるのは、頭&手のトラッキング用に空オブジェクトを作成するのではなく、私は3Dモデル(キズナアイさん)の頭&手のリグオブジェクトをコピーしてCameraRigに入れた点です。

“joint_…”というのがコピーしてきたリグ。後述しますが、両足のIKターゲットも用意しました

上記の理由としては、現状そうするメリットは発生していませんが、一応Final IKのチュートリアルビデオに従ってみました。

今後Final IKの機能であるInteractionSystemを利用して物を掴んだりさせるときに、指のリグも内包させておいた方が良いかもなという邪推もこめています。

また、ここまで実装を終えてUnity上でプレビュー再生したところ、3Dモデルが足を開いて立ってしまう現象が発生したため、足先のリグをコピーしてCameraRigの子要素として配置し、位置を調整しつつIKのターゲットに設定しました。今後は足(と腰)にもVIVEトラッカー(※2018年1月時点でATLにはトラッカー2個だけあるそうです。なので足りない)を用意して動き回るようにしてみたいと考えています。

足にIKターゲットを設定しないと、頭の位置に応じて無理に歩こうとして、結果足が開きすぎる症状

別の問題として、自分自身とキャラクターとの身長や手の長さの違いによって、自分が直立したときに、キャラの身長が自分よりも低いので、キャラクターが上を向いてしまうという現象や、手の長さの違いで、自分が手を軽く曲げていると思っていてもキャラクターの手は伸び切っている現象が起こります。


良い解決法がないかと少し考えたのですが、頭の位置はともかく手の長さも関連してくるので、今回のところは妥協してキャラの3Dモデルのスケールを大きくすることで対応してしまいました。

ここまでで自分がキズナアイさんになって上半身を動かせるところまで実現できました。よくできた3Dモデルを公開してくれていることも素晴らしいし、3DモデルをUnityにインポートするためのMMD4Mecanimアセットも素晴らしいですね。

キャラクターの全身が見れるように鏡を置く

これは@chiepomme様の記事

HTC Vive + Unity で VR 空間に鏡を作る

を参考にさせてもらいました。

特に意図なく、私はQuadではなくPlaneオブジェクトを使いました

Is Mirrorにチェックを入れただけで問題なく動きました

キャラクターの表情・視線・手指を動かせるようにする

私が実現させたかった内容は、ほぼ@toRisouP様のQiitaの記事

VRで「結月ゆかり」になって生放送する

にソースコードも含めてまとめられており、こちらの記事の該当箇所を参考にさせていただき、順に進めました。

表情と視線については、リンク先ページの「表情とポーズの変更」の項目以下を参考にしました。
FaceControllerクラスを紹介してくださっていますが、Unity経験の浅い私からの補足としては

using UnityEngine;
using UniRx;
using UniRx.Triggers;
using Mebiustos.MMD4MecanimFaciem;
using SteamVRInputObservables;

あたりをインポート記述しておくこと。
私はUniRxは初使用でLINQも知らない状態でしたが、便利な仕組みがあるものですね。同じ著者様のQiita記事を見ながら導入できました。UpdateAsObservableを使う時はusing UniRx.Triggers;と書く必要あるとのことです。

FaciemControllerというクラスがどこにも見つからなかったのですが、どうやら

MMD4Mecanimの表情管理と制御 | MMD4MecanimFaciem

の記事中リンクにあるアセットを組み込んであげれば良いそうです。

同じく、FacePatternクラスが存在していないというエラーが表示されました。関連していそうなファイルを頑張って探してみたのですが見当たらなかったので、結果としてはFaceControllerクラス内に

public enum FacePattern
{
  Default,
  Smile,
  Ikari,
  Jito,
  Metoji
}

を追加し、先述のMMD4MecanimFaciemのFaciem Databeseスクリプトをキズナアイモデルに設定し、同名のFaceNameを表情の数だけ設定しました。

kuzunaaiモデルのインスペクタパネルより。同じインスペクタパネル上にあるMMD4MecanimModelスクリプトのMorphタブ内でキャラクターの表情をいじれるので、そこで表情を変更してから、FaciemDatabaseのFaceNameを入力しADD
FACEボタンを押して表情を登録していきます。
Eyesの箇所は視線移動に関連しています。

手指の動きについては、リンク記事ページで紹介されているスクリプトを写経して問題なく動きました。UniRxって便利ですね!

以上、ここまで最終的に実装して、3Dモデル(キズナアイさん)オブジェクトのインスペクタパネルは以下です。

MMD4MecanimModelのPhysicsEngineをBullet Physicsにして髪を揺らそうとしたのですが、前髪が軽くそよぐ程度なので、今後Dynamic Boneアセットを購入して使ってみたいと思っています

まとめ

近頃のブームの影響もあり、VR技術を活用して3Dキャラクターに変身する方法はいろいろと解説記事が書かれていて学習がはかどります。そしてTwitterコメントでも散見されますが、自分がVR空間でかわいい女の子になると、ついつい女の子らしい仕草をしてしまう自分に愕然とします。それも含めて、自分が変身できるという体験は、やはり体験してみると楽しいものですので、ぜひお勧めです。
※広尾まで出向く必要はありますが、ATLにはVIVEもVIVEトラッカーもハイスペックPCもVRするための広いスペース、それらが研究員登録すれば無料で利用できるので併せておすすめしておきますね。私も先日、モーションキャプチャコンテンツの開発者様とか、Hololensコンテンツを開発者の方と雑談・交流できて楽しかったです。