アイトラの効きにくいVRMをunityで簡単に改造する方法

バーチャルキャストで誇れる機能の一つとして
VIVE ProEyeによるVRMモデルの簡単なアイトラッキング制御があります。
VRMのBlink_LRの設定するだけでウィンクや流し目など、リアルな視線が追従できる魅力を一度知ってしまうと、なかなか他のHMDやプラットフォームへ食指が伸びない中毒性があるこの機能ですが
Booth等での販売モデルによっては、目のボーン構成の違いでうまく動かない事が多々あります。

ここではおぐら氏の
「VRMモデルの視線制御（目の可動範囲）の設定方法」
https://qiita.com/OGOG_Ogura/items/46a1f82553c5f6501636
の記事を参照した上で
それでも思い通りに目が動かずに使用を諦めたモデルがある方へ向けての記事です。
かなりニッチな需要だと思いますが、Blenderを触らずにちょっとの操作で
モデルに悪影響を与えずに制御が難しいモデルも目線が動かせるようになるので、ProEyeをお持ちでない方でもお友達などで困っている方が居たらぜひこの記事を共有して下さい。

今回の記事で参考資料として、
【ショップ】けもみみおーこくミュリネ KEMOMIMIX【オリジナル3Ｄモデル】
https://booth.pm/ja/items/4568388

こちらのモデルを参考に進めていきます。

まず、ヒエラルキー上で右クリック→3D Object→Cubeで目線追跡用の目印となるキューブをスケール0.1で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/496f5356-cdfc-fec7-15f3-d00cbfb0b853.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/fb288953-4b91-a65a-6ccd-4ec6b8594b6a.png)

続いて、ミュリネのルートディレクトリをクリックしてインスペクターを下にスクロールした先にある「VRM Look At Head(script)」の「Target」にヒエラルキー上のCubeをD&Dします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/4d1f116d-63b1-3b7f-fbc2-4a82f826f493.png)

この状態でシーンを再生すると、Cubeの位置を目線で追う事ができますが
VRM Look At Bone Applyerの数値を調整しても思うように動きません。
向かって左側にCubeを配置して
Horizontal Outer、Curve Y Range Degree 8の状態（デフォルト）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/9efde973-904c-b9e6-47e7-dedb947fc065.png)

この数値をいくら盛っても、地球儀のように目のボーンが回ってしまうので
見た目が破綻してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/0a78e0f6-2e45-ea6a-51ad-6652461cebc7.png)

実はLook At Bone ApplyerにはBlendshapeで制御できるスクリプトがあります。
しかし可動範囲が決まっているので破綻はしないが物足りない…という場合もあると思います。また、Blendshape内に以下の表情設定が必要で
LookLeft
LookRight
LookUp
LookDown
この4種にそれぞれのBlendshapeを割り当てないと動きません。
（ミュリネの付属VRMには目線の上下左右のBlendshapeが無いので割愛します。）

では、ここからが本題ですが、
VRM Look At Bone Applyer(script)内の
「Left Eye」「Right Eye」をクリックすると
ヒエラルキー上の指定の場所まで一気に開きます。このオブジェクト構成を改造します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/0309a585-b51a-ea78-d310-4b3f03fb996a.png)


Eye_Lを右クリックして「Create Empty」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/610bc948-e4c6-6bd7-a798-57cf62a6b497.png)

名前を親オブジェクトと同じ「Eye_L」に変更し
本来の目のオブジェクトを「Eye_L2」に改名します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/bdf6c0a3-c33e-655c-5a92-8300f2bd927e.png)

この後がポイントですが、子オブジェクトの「Eye_L」を
一旦Head下へD&Dします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/587890d0-a3c2-0d7e-d6ad-e6d4f3566611.png)
こうする事で他のオブジェクトに影響を与えず、Eye_Lのオブジェクト座標を調節できます。
VRM Look At Bone Applyer(script)による視線制御は
目のボーンの座標を基準に左右に曲がる為、中心位置が近いと歪んでしまうので、この空オブジェクトの「Eye_L」を後頭部へ移動させます。
（図ではpositionのZ値を-0.05に変更しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/0bab9eb8-97f1-dfce-ef97-e40b213bedf0.png)
座標の変更後に、空オブジェクトの「Eye_L」を親として
本来の目オブジェクトである「Eye_L2」を子としてD&Dします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/8b456053-08e2-d626-4551-8499b87e1695.png)

基本的に右目、左目とやることは同じなので、左目ができたら同じように右目も改造してみましょう。

2つのオブジェクト構成の改造が終わったら、ルートディレクトリから
VRM Look At Bone Applyer(script)を確認しましょう。
参照するボーンがリネームされたので、変わっていますね。
これを空オブジェクトの「Eye_L」「Eye_R」に変更しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/4a3d6e12-5831-e038-c4d5-4bc7dd16b5b3.png)

↓このように変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/514f3c02-fda1-1d00-7db9-e4106159b344.png)

この状態でシーンを再生して、Curve Y Range Degreeを調整すれば
想定通りの動き方をすると思います。
もしこれでも視線の動きに歪みが生じる場合は、空オブジェクトの座標をもっと後ろに下げてみて下さい。逆にどれだけ減らしても動きすぎる場合は手前側に空オブジェクトを動かして調整してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074894/a7a94604-5038-068e-e371-27df4bbb45d7.png)

お好みの可動範囲が設定できたらシーン再生を閉じる前に
「copy component」して、閉じた後に
「paste component value」で値を上書きしましょう。

最後にVRM出力ですが、今回の改造では回転拡大縮小は用いていませんが、
親子関係をいじっているので念のため正規化（Pose Freeze）で
出力しましょう。

これでアイトラッキングがうまく働かずに眠っていたあの子も救われるかもしれません。
ProEyeをお持ちの友達がいたらぜひこの記事を共有して
無加工では味わえない目線トラッキングを体験してみて下さい。

それでは、良いクリスマスを！