HTCvive使ってサーバルちゃんになりたかった話①
挨拶
どうも、哲人28号です。
時の流れは早いもので、社会人になり5ヶ月とちょっとが経ちました。
生後で言ったらもうハイハイしていてもおかしくない、そんな時期です。
まぁ、今でもおっぱい吸いたいですけどね。
事の起こり
久しぶりにHTCviveを使って何かできないかなと思ってニコ動でVR技術系の動画を
あさっていた所、この動画を発見しました。
見るのがめんどくさいよー!と言う人に向けて説明すると、
Unityでサーバルちゃんの手足にボーンを追従させるターゲットオブジェクトを
配置して、IK(インバースキネマティクス)でサーバルちゃんを外から動かすよ!
ってな内容になってます。
この動画を見て思ったんですよ・・・
これ、内側から動かしたればサーバルちゃんになれるんじゃね?
と、言うことでサーバルちゃんになるぞ俺はなるぞお前。
準備
まず、今回はタイトルにある通りHTCviveとUnityを使って行くのですが、
今回使わせていただいたモデルはこちら。
ついでにさばんなちほーも。
ちなみにどちらのモデルも配布サイトに従ってモデルをダウンロードするのですが、
MMDでの使用を想定してあるため、そのままではUnityに取り込むことが出来ません。
なのでちょっと一手間加えます。
サーバルちゃんは.pmx形式なのでMMD4Mecanim (※1)を使いUnityに取り込み、
さばんなちほーは.mqo(メタセコイア())形式のため、一度Blenderに取り込み、
Unityで扱える.fbxに変換します(この際にもblender側で.mqoをインポートするためのプラグインを使っていますが、今回は省略)
で、Unityに読み込んだらシーン上に配置します。
やっぱりUnity楽でええなぁ。
ちなみにゲームビューではこんな感じ。
遠景まで見えると、ちゃんとさばんなちほー感でてます。
記事の冒頭で紹介した動画見る限り、
そんなにやること多くなさそうなのでサクッと作っていきましょう。
あ、あと一応ですが配布されているMMDモデルによっては、改変の禁止・MMD以外への使用を禁止する規約等が定められている場合があるので、readmeとか配布サイトの規約はキチンと読みましょう。
※1: Nora(@Stereoarts)氏が公開しているMMDモデル形式をUnityに取り込むためのCustomAsset。
※2: 3Dモデリングソフトの一つ。無料でも使えるが、凄い機能が制限されるので筆者はBlenderの方が好き。
実装
HTCviveをトラッキングしてUnity側上で取れる情報は
- ヘッドセットの 位置・向き
- 左右コントローラーの位置・向き
です。VRトラッカーとか買えばもっと取れたりするんですが、今回は使わないし持ってないのでので割愛です。
ヘッドセットでサーバルちゃんの頭、コントローラで左右の手の位置・方向を追従させることでサーバルちゃんになります。
その際IK(インバースキネマティクス)を使います。
IKを利用することで、手先の位置・方向を動かすだけで肩から手首までの角度を自動で計算し、曲げてくれるようになります。
IKについての詳細も話そうとすると別に記事一つ作れる量になりそうなので、割愛しますが興味が湧いたら調べてみると良いと思います。
ただ、IKを設定するスクリプトを自前で書こうとすると大変なので、
今回はUnityが提供するhumanoidのIK機能を使ってみたいと思います。
humanoidのIK機能の設定
シーン上に設置したサーバルちゃんの元となるモデルデータを選択し
[Inspector]から[rig]を選択します。
[rig]項目内にある[AnimationType]から[humanoid]を選択します。
[humanoid]に設定することで、人型のモデルにUnity側からUnity共通で使えるボーンの設定を行ってくれるようです。
これでIKが使えるようになったので、サーバルちゃんモデルにAnimatorControllerを追加しIKの設定をします。
と言っても、チェックボックスにチェック打つだけなんですが。
UnityのIKの設定は公式のマニュアルの方にも載っているので、参考までに。
きちんとIKが効いているかわからないので、公式マニュアルに従ってちょっとスクリプト入れてみましょう
仮のオブジェクトCube作成し、子オブジェクトに手を追従させるEntityを作成します。顔はカメラ目線でもしてもらいましょうか。
モーションはUnityのサンプルにあったhumanoidWalkをさせます。
どうやらちゃんと効いているようですね。
シーンビューからCubeを動かしても、ちゃんと手が追従するのが確認できます。
これでIKの設定ができたので、次回からいよいよHTCviveでサーバルちゃんと合体します。