VR酔いの軽減
バーチャルリアリティアプリの天敵、VR酔い。
はじめてのVR体験で酔ってしまった方は、たとえ別のアプリでもVR体験自体を避けるようになってしまうかも。
このページではその軽減を目指します。
主な参考資料
VR酔いの軽減に効きそうなこと (独自調査のため、誤っているかもしれません)
性能
- VRヘッドセット毎に設定されているフレームレートが出るようにチューニングする。
(Oculus Rift DK2/Gear VRなら75fps、Oculus Rift CV1/HTC Viveなら90fps)
- Oculus Utilities for Unity使用時はOVRDebugInfo.csをアタッチすると、再生時にスペースキーでフレームレートが表示されるので簡易確認に便利。
- より詳細な内容は、Unityであれば、[Window]>[Profiler]にて確認できる。
- ポリゴン数を減らす。
- 【Unity】基本的に参照はキャッシュする。(例:都度GameObjectをFindするような実装は避ける。)
- 【Unity】ライトマップをベイクする。
- 【Unity】半透明を使わない。
- 【Unity】オクルージョンカリングを使う。
- 【Unity】メッシュを結合する。(広範囲に結合するとオクルージョンカリングに悪影響がある)
- 【Unity】動かないオブジェクトはStaticを有効にする。
移動
- 移動は等速直線運動。加減速は控える。必要な場合は徐々にでなく瞬間的に行う。
- 実装例:Showdown (低速の等速直線運動。なお、このトレーラーでは勝手に視界が回転しているように見えますが、実際は回転はユーザー任せです。)
- 加減速はできる限りユーザーの操作によるものとする。
- 視界の振動などの演出は行わない。(歩行演出など)
- ユーザーの視線方向以外への方向への移動は避ける。(移動方向へユーザーの視線を誘導するという解もある?)
- どのように動くかあらかじめ分かるようにする。(例:ジェットコースターのレール)
- ワープは酔いづらいという説もあるため、導入を検討する。
- 実装例:Bullet Train
- 実装例:Blink
- 実装例:Tunneling
回転
- 回転軸によって、酔いやすさが異なる。ロール方向(簡単に言うと首をかしげる方向)の回転は控える。
- 参考文献:氏家弘裕 (2010), 映像の安心な利用を可能にする映像酔い評価システムの開発, Synthesiology, Vol.3 Np.3, pp.180-189
- 実装例:Silhouette Striker
表示
- ユーザーの頭の動きと連動する全画面表示やHUDは避ける。
- 視界に入るように固定物を表示する。
(例:操縦桿、窓枠など。「視界に物体を固定する」ではなく、「視界に固定物が入るようにする」であることに注意。HUDではない。)
- 実装例:EVE: Valkyrie
- 実装例:RIGS
- 実装例:Battlezone
視点
- 一人称視点と三人称視点では三人称視点の方が酔いづらい。一人称視点の必然性があるかを検討する。
- 実装例:AirMech
- 実装例:Lucky's Tale
- 実装例:箱庭の彼女
- 体験する際の視点の高さにカメラの位置を合わせる。 例えばOculus Utilities for Unityなら、1.3.0からTracking Origin Typeが選べるので適切な値に設定する。(Eye Level or Floor Level)
視野
- 周辺視野を制限すると酔いづらいという研究結果もあるため、導入を検討する。
- 参考文献:(噂は耳にするものの見つけられていないので、どなたか教えてください (^^; )
- 実装例:Eagle Flight (7分28秒辺りからの遠くに映っているモニタを映像を見てください)
高速移動時の周辺視野を制限するスクリプト(β)
概要
プレイヤー自身が静止しているにもかかわらず、バーチャルリアリティヘッドセットの画面内では風景が動いて見える場合、 ベクション(視覚誘導性自己運動感覚)によるVR酔いが生じることがあります。 これはジェットコースター系VRアプリなどで顕著です。
本スクリプトでは、高速移動時の周辺視野をマスクで制限することによって、 ベクションによるVR酔いの軽減を目指してみます。
あくまでも実験的スクリプトですので、効果がない、あるいは逆効果であることも考えられます。 ご利用にあたってはご注意ください。
ダウンロード
mask_peripheral_vision_20170115.zip
使用方法
- UnityのGitHubからPost-processing Stackをダウンロードし、インポートする。
- Unityのメニューから[Asset]>[Import Package]>[Custom Package]と選択し、 mask_peripheral_vision.unitypackageをインポートする。
- OVRCameraRig/TrackingSpace/CenterEyeAnchorにMaskPeripheralVision.csをAddする。
- 速度の変化が生じたら、以下のようにChangeMaskSizeメソッドを呼ぶように、ご自身のスクリプトを修正する。
GameObject mask = GameObject.Find("OVRCameraRig/TrackingSpace/CenterEyeAnchor");
mask.GetComponent<MaskPeripheralVision>().ChangeMaskSize(speed); - MaskPeripheralVision.csの値を調整する。
項目 説明 Min Speed With Mask マスクがかかり始める最小の速度 Max Speed With Mask マスクがかかる最大の速度 Mask Strength マスクの強度[%] Smoothness どのくらい滑らかにマスクの強度を変化させるか - [Play]ボタンをクリックする。