OVR Vignette でビネット効果 (トンネル効果)を発生させて移動時のVR酔いを軽減させる 【Oculus Integration】

今回の記事はOculus Integration v14 から追加された OVR Vignette を用いたVR酔い対策についてです.

Vignette 効果 (トンネル効果)

こちらの画像のことです.

f:id:xrdnk:20200811225008j:plain

Vignette - Unity マニュアル

移動時に周辺視野をぼやけさせることで視覚から得られる情報量を軽減させ,VR酔いを防ぐことに繋がる方法です.
その他のVR酔い対策について興味がある場合は以下の記事が詳しいと思います.

framesynthesis.jp

Post Process Stack v2

Post Process Stack v2 に Vignette があります.
設定方法については下記記事が詳しいと思います.

qiita.com

Cameraに PP Layer をアタッチし,PPSを適用させたい範囲に PP Volume を付ける感じです.

OVR Vignette

ただ,他のPPSを使わずに,Vignetteのみを利用したい場合は,Oculus Integration v14 から追加された
OVR Vignette スクリプトをMain Cameraにアタッチするだけで,Vignette効果を簡単に適用できます.

f:id:xrdnk:20200811225650p:plain

Mesh Complexity

Vignette効果のメッシュの強さ.Very Simple でもっともTriが少なく,Very Detailed でもっともTriが多くなります.

f:id:xrdnk:20200811230036j:plain
Very Simple

f:id:xrdnk:20200811230050j:plain
Normal

f:id:xrdnk:20200811230103j:plain
Very Detailed

Very Simple だとカクツキが目立ちますが,Normal と Very Detailed の間では,
違いはVRHMDを被る上では,あまり違いがわかりにくいので,
デフォルトの Normal でよいかと思います.

Falloff

Falloffの外観の調整です.
光が光源から異動する際,通常は強度が低下し,光源が照らすことが出来る領域が制限されます.
この減「強度が低下」している現象をFalloffといいます.
減衰係数?

少し難しい話ですので,こちらのWikiを読むといいかもしれません.

Constant-Linear-Quadratic Falloff - Valve Developer Community

Linearだとぼやけ(黒)の領域が増え,Quadraticだとぼやけ(黒)の領域が減っている感じです.
違いは画像を見て比較した方がわかりやすいです.

f:id:xrdnk:20200811230503j:plain
Linear

f:id:xrdnk:20200811230515j:plain
Quadratic

Vignette Field OF View

Vignette の FOVです.
値が小さいほど領域が狭まり,大きいほど広くなります.
Rift S を被った場合,個人的には 75 にすると程よい感じになりました.

f:id:xrdnk:20200811231228p:plain
FOV 10

f:id:xrdnk:20200811231245j:plain
FOV 75

Vignette Aspect Ratio

Vignette のアスペクト比です.
こちらは円形を保ちたい場合は1でよいでしょう.

Vignette Falloff Degress

Vignette Falloff の領域の広さです.
数値が低くなるほど,ぼやけの範囲が小さくなります.

Rift S を被った場合,個人的には 15 にすると程よい感じになりました.

f:id:xrdnk:20200811231605j:plain
Falloff 5

f:id:xrdnk:20200811231618j:plain
Falloff 15

Vignette Color

Vignette の色です.
VR酔い対策ならデフォルトの黒でよいかと思います.
他の使い方,例えば流血表現などであれば,赤に変更することもできます.

Vignette効果発生のサンプルスクリプト

アナログスティック入力を取得して,magnitudeが閾値を超えていたら,
Vignette効果を発生させ,超えてない場合は発生させないようにしています.

private static readonly float THRESHOLD_MOVE = 0.15f;

Vector2 stickL = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);

if (stickL.magnitude > THRESHOLD_MOVE)
{
    // 動く時,Vignette効果を有効化する
    _vignette.enabled = true;
}
else
{
    // 静止する時,Vignette効果を無効化する
    _vignette.enabled = false;
}

実際にやってみた

こんな感じになります.

f:id:xrdnk:20200811233238g:plain

終わりに

OVR VignetteをMain Cameraにアタッチし,移動時にenableにするだけで簡単なVR酔い対策に繋がります.