Oculus LiftとFinalIKを使ってバーチャルYoutuberになる方法

OculusとFinalIKを使ってバーチャルYoutuberになってみました。

この記事のゴールは、自分の動きと3Dモデルの動きを連動させることです。

Unityの知識は全く無いですが、[はるねずみさん](https://twitter.com/halne369)の記事を参考にさせていただき、なんとか動かすことができたので簡単にまとめてみたいと思います。

##はじめに
ここでは、Unityにキャラがインポートされていることを前提に進めていきます。
もしMMDデータをUnityで使える状態にできてない方は以下の記事を参考にしていただければ問題ないかと思います。
(https://qiita.com/ngron/items/cdd3248c7ff96a1bc5b0)

##開発環境
- Unity 2017.3.1f1(https://unity3d.com/jp/get-unity/download)
- Oculus Lift(https://www.oculus.com/rift/)
- Oculus Utilities for Unity(https://developer.oculus.com/downloads/unity/)
- FinalIK(https://assetstore.unity.com/packages/tools/animation/final-ik-14290)
- KizunaAi(http://kizunaai.com/download-page/)
- MMD4Mecanim(http://stereoarts.jp/)


Oculusが5万。
FinalIKが9千なので、
予算はだいたい6万円くらいですね。
##デモ動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">VTuberって最近流行ってますよね。<a href="https://twitter.com/hashtag/%E5%8B%95%E3%81%8D%E3%81%8C%E3%82%AD%E3%83%A2%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F?src=hash&amp;ref_src=twsrc%5Etfw">#動きがキモくなった</a><a href="https://twitter.com/hashtag/%E3%82%AD%E3%82%BA%E3%83%8A%E3%82%A2%E3%82%A4?src=hash&amp;ref_src=twsrc%5Etfw">#キズナアイ</a> <a href="https://t.co/DhBVvSokKR">pic.twitter.com/DhBVvSokKR</a></p>&mdash; レオン@宿借りエンジニア (@ngron1210) <a href="https://twitter.com/ngron1210/status/976741861011304448?ref_src=twsrc%5Etfw">2018年3月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




##制作の流れ
1. OVRCameraRigをモデルの頭に配置
2. OVRCameraRig> TrackingSpaceの階層下にあるAnchor(head,hand…)下にそれぞれ空のobject(head,hand(右、左))を作る
2. OVRCameraRigの階層下に動かしたい3Dモデルを設置
3. 3DモデルにVRIKスクリプトをアタッチする
4. VRIKスクリプトのにあるHeadTargea,にトラッキングスペースに配置した空のObjectをアタッチする。(右手、左手も同様にアタッチ)

##OVRCameraRigを頭周辺に配置する
[Oculus Utilities for Unity](https://developer.oculus.com/downloads/unity/)をダウンロードしてインポートしましょう。
OVR > prefabs > CameraRigを頭に配置します。positionは(0, 1.35, 0)くらい？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/2dd51a8c-1ce3-2db6-ece7-2d0dc2342997.png)
この辺は各自で調整していただければと。

追記なのですが、キャラの設定をHumanoidにしないと動かないと気づいたのでここで設定しておきます。
キズナアイを選択し、selectを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/60b037d4-e5ef-cc63-8f41-d2159f456794.png)

Rigを選択、AnimationTypeを**Humanoid**にしておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/7eb17bbf-54aa-88dd-976a-4a77dd16a691.png)

これで準備完了です。

##トラッキングスペースに空のオブジェクトを作る
OVR > TrackingSpaceに、CenterEyeAnchor,LeftHandAnchor,RightHandAnchorの３つのトラッキングスペースがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/57b366f5-8cb4-db32-4e5e-37c12649e7e0.png)
CenterEyeAnchor　→　ヘッドマウントディスプレイ
LeftHandAnchor　→　Oculus Touchの左手
RightHandAnchor →　Oculus Touchの右腕
がそれぞれ対応しています。

ということは、これらのトラッキングスペースにモデルの頭、左手、右手を入れてあげて、トラッキングさせれば良いのです。

本来は3Dモデルのパーツを当てはめるものいいですが、代わりに頭、手(右左)の空のオブジェクトを作って、トラッキングさせる場所の階層下に入れていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/e3a5f44f-a429-06ca-9f75-1ff5993b1c78.png)

名前は分かりやすいように、HandTarget , LArmHandTarget , RArmTargetとしておきました。

しかし、キズナアイの場合、デフォルトのままでは腕の角度や動きがおかしくなってしまうので、角度の調整をします。（FinalIKのモデルに合わせないといけない）
左腕は　90度
![lefthand.PNG](https://qiita-image-store.s3.amazonaws.com/0/242611/99cd0ac9-9770-4e76-a614-d5c8b2c28564.png)

右腕は -90度としましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/d2eacffa-df93-bb8e-dc8d-26f6a95da94d.png)
この辺は後に説明します。

##OVRCameraRigの下に動かしたい3Dモデルを設置
OVRCameraRigの階層下に対象の3Dモデルを入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/29bb8b24-30fe-c7c5-3947-6019e668e8d0.png)

##VRIKスクリプトをアタッチし、Targetを指定する
ここからは[FinalIK](https://assetstore.unity.com/packages/tools/animation/final-ik-14290)をダウンロードします。

VRIKがどこにあるのかさっぱり分からなかったんですが、検索したら普通にでました。。
これをKizunaai(対象の3Dモデル)にアタッチします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/6a8c99ef-04f0-bd69-000f-ac32b42aab64.png)

次に、VRIK　> Solver > Spine　を開き、Head Targetに最初CenterEyeAnchorの下に作った空オブジェクトをアタッチしましょう(ここではHeadTarget)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/a7792a34-b1c7-315c-c11d-4c72269dfa50.png)

LeftArm , RightArm も同様です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/642c49f0-aa13-f56f-66f5-7fe6049055bf.png)

これで無事動くかと思います。


##撮影用カメラを設定して自分の姿を見られるようにする
しかし、このままでは自分の動作確認ができないので見られるようにしましょう。
まず新しいカメラを追加します。今回はFocusCameraとしておきました。（MainCameraは消してしまって構いません)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/ddd70262-0c0d-5741-5e3a-df8b6fc654bb.png)

新しく追加したカメラのInspectorを開き、Target EyeをNoneにし、Audio Listenerのチェックを外します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/4d2ff584-8c66-b002-e70b-8d36b4fdc6ca.png)


以下のコードを新しいカメラにアタッチさせます。

```VRmirrorSettings.cs
public class VRmirrorSettings : MonoBehaviour {

	// Use this for initialization
	void Start () {
        UnityEngine.XR.XRSettings.showDeviceView = false;
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

これで再生し、別視点のカメラがでていることを確認してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/88283218-d1b1-c0b4-e126-b04583ead007.png)

##ヘッドマウントディスプレイで自分の姿を見られるようにする
ヘッドマウントディスプレイを付けながらでも自分の動作確認をして見たい方もいるかと思うのでやり方を紹介します。

CenterEyeAnchorがヘッドマンとディスプレイの視点になるので、これを動かします。positionをZ方向へ少し移動させ、角度を180度回転させたら自分の姿が見れるはずです。
カメラが増えてますが、構図はこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242611/9d0a233a-8a1c-aab7-f07a-f9ec9ab192af.png)

カメラの距離などは各自調整していただければと。

##**注意:** キャラによってパーツの角度を調整しなければならない

3Dモデルの骨格の向き　≠　FinalIKの骨格の向き
となっていることに気をつけていただきたいです。

なので今回この記事で使ったキズナアイちゃんも、頭や腕の向きを調整しないと変に曲がった状態になっています。
参考記事：https://qiita.com/halne369/items/daadf0e00330a1019830

##まとめ
ただいろんな記事を真似て組み合わせただけなんですが、
超簡単にまとめると、VRIKの骨格にトラッキングスペースにあるObjectをそれぞれ当てはめるとデバイスの動きと連動する仕組みなのかな？と個人的に解釈しています。

もし間違ってたら指摘していただければと思います。