【Unity】Oculus RiftとFinalIKを使ってUnityちゃんになる。

# はじめに

キズナアイさんになりきる方法や、Viveを使った方法などの記事はありましたが、
Oculus RiftとFinal IKを使ってUnityちゃんになる記事が見当たらなかったので、メモ程度に残しておきます。

[Oculus LiftとFinalIKを使ってバーチャルYoutuberになる方法](https://qiita.com/ngron/items/f90ace8cb84f3aebaa5f)
[Oculus Rift + VRIK で 初音ミクになりきってみる](http://c-taquna.hatenablog.com/entry/2017/09/16/221236)
こちらを参考にしました。
というか、むしろ「[Oculus LiftとFinalIKを使ってバーチャルYoutuberになる方法](https://qiita.com/ngron/items/f90ace8cb84f3aebaa5f)」の記事とほぼ一緒です。

# 環境
* Unity5.6.3p2(諸事情で)
* Oculus Utilities for Unity
 * 自身のUnityのバージョンと合ったものをお使いください

* FinalIK
* Oculus Rift

# おおまかな流れ
「[Oculus LiftとFinalIKを使ってバーチャルYoutuberになる方法](https://qiita.com/ngron/items/f90ace8cb84f3aebaa5f)」とほぼ同じです。
1. 空のGameObjectをHierarchyに配置
2. そこにUnityChanとOVRCameraRigを配置
3. OVRCameraRig -> TrackingSpace -> CenterEyeAnchorにHeadTargetという名前で空のGameObjectを配置
4. 3.と同様にLeftHandAnchorにLArmHandTarget, RightHandAnchorにRArmHandTargetという名前で空GameObjectを配置。
5. unitychanにVRIK(FinakIK)をAdd component
6. VRIKのHeadTargetにHeadTargetを、Left ArmのTargetにLArmHandTarget、Right ArmのTargetにRArmHandTargetをアタッチする。

# OVRCameraRig,UnityChanを配置
UnityChanとOVRCameraRigを空オブジェクト内に配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/fe79aa95-2fbe-a6cb-d7b7-0e39115154a8.png)
空オブジェクト位置は(0.0,0.0,0.0)になっています。
その時に、OVRCameraRigの位置は、unityChanの目線に合わせてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/6cd1bee6-2a88-c733-7558-ce5d1471a3d3.png)
私は(0.0,1.3,0.0)にしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/753c4071-77b9-742a-94d9-3934f49286e5.png)

# Anchorに空オブジェクトを配置する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/62411eaf-16a4-e0ce-ae3f-c68d400eeec0.png)
このとおり、CenterEyeAnchor, LeftHandAnchor, RightHandAnchorに空オブジェクトを配置します。
この空オブジェクトの位置は、VRIKを使って
HeadTarget　→　モデルの頭の位置
LArmHandTarget　→　モデルの左手の位置
RArmHandTarget　→　モデルの右手の位置
と対応していきます。

このままでは、UnityChanの手足の向きがおかしくなるので、調整します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/c4473966-3771-3d61-f56d-b1df496453ab.png)
Z方向が0のままだと、OVRCameraRigがUnityChanに若干めり込むことがあるので、モデルの頭の位置は少し後ろに設定しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/c506c30a-c9ac-a920-a0cb-c9dcd69c93eb.png)
左手、右手はこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/d6c2f782-b3ea-7dd3-91be-cac11c6361c3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/a8f65bb7-7d5a-0940-2c4a-e760f9ce2445.png)

# UnityChanにVRIKをアタッチします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/66cb7e9b-3c5c-62e2-0780-f51b2c35513f.png)

# VRIKにHeadTarget, LArmHandTarget, LArmHandTargetをアタッチする
初期のパラメータからおそらく何も変えてないと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/e764388e-fc13-47f7-00fe-6cca1f14dd58.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/fb619b5a-a38c-b524-2b07-d5fa3019a80e.png)

これで、UnityChanをOculusRiftの位置によって動かせるようになりました。

# 新しくカメラを配置し、UnityChanの様子を見れるようにする
「[Oculus LiftとFinalIKを使ってバーチャルYoutuberになる方法](https://qiita.com/ngron/items/f90ace8cb84f3aebaa5f)」のコードをもとに、
UnityChanの様子を客観的に見えるよう新しくカメラを配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/182aad40-8063-03a3-34d9-73cb8295b050.png)
新しくカメラを配置したあと、Target EyeをNone、Audio Listenerのチェックを外します。
そして、VRmirrorSettings.csをアタッチします。

```cs: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 () {

    }
}
```

これで、動作の様子が客観的に見えると思います。

# Oculusの位置トラッキングの影響でカメラからアウトしてしまう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/00d8a21e-831a-9aa2-06e7-2bbb012c6b6c.png)
UnityChanが画面の中心にくるようカメラを配置していましたが、Oculusの位置トラッキングの影響でカメラからアウトしてしまいます。
そこで、位置トラッキングをリセットするコードをOVRCameraRigに貼り付けます。

```cs:RKeyToRecenterPose.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RKeyToRecenterPose : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        // Rキーで位置トラッキングをリセットする
        if (Input.GetKeyDown(KeyCode.R))
        {
            OVRManager.display.RecenterPose();
        }
    }
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/18b3d0cd-bb77-a193-9d79-7dcdf1a93fc3.png)

こうすれば、Oculusを装着した後にRボタンを押すことで、画面の中心にUnityChanが写るようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/f6e00b4e-7b9e-debd-3d38-3cf0615172f2.png)

# 完成
Oculusからの視点
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/b32a5e3a-0f71-3f90-ac70-f5bd1aad34b9.png)
カメラからの視点
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/e257beb4-50c5-cd55-0b61-797639de524e.png)

これで、一応UnityChanになりきれました！
でも、女の子にしては仁王立ちすぎるので、まっすぐ立たたせるようにします。

# 仁王立ちなので調整する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/5999c925-af85-71a2-d14c-496235725105.png)
VRIKのLeft LegとRight Legを使っていきます。

Left LegとRight Legのターゲットとなるものを、わかりやすいようにCubeで作成し、UnityChanの足元の位置に調整します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/d8e2abef-8a41-d897-7baa-0184ee57ebbe.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/9bfd2ebc-134e-881d-02ac-0fc2cf664548.png)

left -> Left LegのTarget
right -> right legのtarget
にアタッチします。
そして、それぞれのposition weightを0.7にしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/dedd77ee-b15b-6e79-7cbb-1b6e44c04643.png)

これで、姿勢がきれいになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92777/b32186f1-c2f5-2bc4-74da-0308a7ec17d1.png)

position weightは足のターゲットの位置への比重を表します。
この値を高めることで、ターゲットの位置にアバターの足が近づきます。

VRIKのSolverの値について、詳しくはこちらの記事に書いてあります。
[Final IK の VRIK の Solver にある各値の説明](https://qiita.com/_karukaru_/items/b74bb5bdf08f5de32d0e#final-ikvrik%E3%81%A8%E3%81%AF)

# 最後に

基本的にはこのやり方でOculusとアバターの連携はできると思います。
アバターの手や頭の向きが変になってしまうのは、HeadTarget, LArmHandTarget, LArmHandTargetの角度パラメーターをいじっていくしかないです。ほとんど気合です:relaxed:

次回は、立った状態ではなく、アバターを座った状態にさせてみたりしたので、気が向いたら記事にしたいと思います。
それとオリジナルのVtuberシステムも作ったので、それも気が向いたら記事にしていきます。