VR酔い対策について
最終更新日:2016年12月11日記事作成日:2016年06月13日
VRコンテンツの制作における酔い対策についてまとめています。
更新履歴
(2016年10月10日)「進行方向のガイドになるオブジェクトを表示する」「自分の身体にオブジェクトが干渉しないようにする」を追加
(2016年8月26日)項目をいくつか追加
(2016年8月23日)「移動をどうするか」を拡充
(2016年8月21日)項目をいくつか執筆
(2016年6月19日)「なぜ酔いが起きるの?」を作成、その他記述を追加
なぜ酔いが起きるの?
VR酔いは、乗り物酔いと同じように、自分が体感・予測している感覚や、記憶している感覚の間にずれがあると発生します(感覚不一致説)。
特に、視野の広範囲に流れがあると、自分自身の身体が実際には移動していなくても、移動しているような錯覚が生じます(例えば、止まっている電車に乗っていて、向かいの電車が動きはじめたとき、こちらの電車が動いているように感じたことはないでしょうか?)。これをベクション(視覚誘導性自己運動感覚) といいます。VRヘッドセットで移動の感覚を生み出す重要な効果ですが、一方でこのベクションが他の感覚との齟齬を引き起こし、酔いの原因となることがあるようです。
なぜ感覚の不一致で気分が悪くなるのかについては、もっともらしい仮説の一つとして、poison theoryというものが提唱されているようです。感覚の不一致があるのは、毒を食べたり飲んだりしてしまって幻覚を見ているためで、毒を吐き出そうという防御機構が人間の進化の過程で備わっているのだという考え方です。
酔いを低減するには?
フレームレートを確保する
まず描画負荷を低減したり、PCでは高性能なビデオカードを使うなどして、最大フレームレートを確保します。フレームレートが低いと、頭の動きと視界の不一致で酔います。
PCの選定については以下のページを参照してください。
頭の動きと無関係にカメラを動かさない
カメラの向きは常にユーザーの頭の動きに追従させるようにします。メニュー画面やポーズ画面、さらにはカットシーンであっても、ユーザーが常に周囲を見回せるようにします。つまり、従来の3Dゲームや映画のようなカメラワークのカットシーンは作れないということです。
よく開発者フォーラムなどで、ヘッドトラッキングを無効化するにはどうすればいいのかという質問がありますが、よほどの理由がない限り禁じ手です。覿面に酔います。
カメラを激しく動かさない
例えば一般的な3Dゲームでは、爆風や衝撃などの揺れ演出があったり、歩行にあわせてカメラを上下に揺らしたりしますが、こうしたものをカットします。ただ、歩行の揺れはあるほうが酔わないという人もいるようで、オプションなどで選択できるようにしておく必要があるかもしれません。
また、三人称視点のゲームではカメラの動きをイージングでなめらかにします。
水平線を傾けない
人間や動物には、自分の姿勢の変化に応じて首や四肢、眼球を反射的に動かし、視界を安定させようとする、いわばスタビライザーのような仕組みが備わっているようです。下の動画の30秒あたりから再生してみてください(thx: Nao_uさん)。
しかし、前庭器官などによって身体や頭が傾いたという感覚がないまま視界を傾けると、この安定化ができないため酔ってしまうようです(と個人的には解釈しています)。
このため、カメラのロール運動をキャンセルするという酔い対策がしばしば実装され、有効性が確認されています。参考として、「カメラがロールしないようにするには?」にUnityでの実装例を載せました。
とはいえ、フライトシミュレーターなどではロールさせないわけにはいかないため、さてどうしましょうかといったところです(CEDEC 2016の講演にて、PlayStation VRの関係者も、現状有効な酔い対策手法を提案できないとのことでした)。
プレイ時間を短めにする
酔いだけではなく圧迫感や蒸れなどの問題で、VRヘッドセットを長時間装着しつづけること自体が現状では厳しいので、体験時間を短めにしたり、ゲームでは短時間で一区切りつくようにするのが現実的かもしれません。
未体験の人で十分にテストする
VRコンテンツを制作している側は、自分が作っているもののカメラの動きをよく知っているためまったく酔わなくなってしまいます。「被験者」を探して、どれくらい酔いやすいか、酔うポイントがないかを必ずチェックするようにします。
自分の身体にオブジェクトが干渉しないようにする
酔い対策とは若干異なりますが、自分の身体があるはずの場所に身体以外の物体があると不快感が生じます。例えば、人間が通れないはずの狭い隙間をカメラがすり抜けていくといった演出はやらないほうがいいでしょう。VR空間内において体験者がどう存在しているのかを意識するのが重要だと思います。
移動をどうするか
VRにおいて移動は鬼門です。普通の3Dゲームのように主観移動すると、視覚とその他の身体感覚との齟齬がどうしても発生し、酔いの原因となることが避けられません。さまざまな対策や回避方法が検討されています。
定点カメラにする
身も蓋もありませんが、いっそ移動させないという方法があります。ゲームデザインや、ユーザー体験のデザインをする時点で体験者の位置固定で考えるということです。厳しい制約ですが、最も確実で効果のある酔い対策です。
なおルームスケールVRであれば、定点カメラでも一定の範囲を歩きまわって移動することができます。この場合は視覚と他の感覚が一致していますので、酔いは発生しません。
テレポート移動する
定点カメラのメリットを得つつそれでも移動したい場合、テレポートで移動するという方法があります。採用例としてはUnreal EngineのBullet Trainデモが有名です。移動ポイントをシーン内に点在させておき、注視してボタンを押すと瞬間移動します。
また、HTC ViveのThe Labのように、ボタンを押しっぱなしにしてモーションコントローラーで移動先をポイントし、離したらそこにテレポートというタイプもあります。
酔わずに移動できるという点では実用的ですが、あくまで現実世界とは異なる移動方法であることに注意が必要です。ゲームでは、主人公がテレポートする能力を持っているという設定にしてしまうといったことが考えられます。また、例えば、ゾンビに追いかけられているときに次々とテレポートで逃げることができてしまうようだと興ざめでしょう。
加減速を避ける
加減速や、衝突による急激な速度変化が発生すると感覚の不一致で酔うため、これをできるだけ避けるようにします。壁にぶつかる、地面に落下する、自分と相手が接触するといったものは難しいです。
一方で、前方にずっと等速直線移動しているぶんにはほぼ酔いませんので、これをベースにゲームを組み立てることができます。
自由移動の際には、慣性がかかっていると加減速で酔いやすいです。一般に、慣性なしで一瞬でトップスピードになるようにしたほうが快適です。
衝突などの速度変化が生じる前に、画面をフェードアウトさせて見せないようにするといったテクニックもあります。
移動時に周辺視野を隠す、ぼかす
ベクションの発生による感覚の不一致を抑制するために、移動中に画面の周辺部をなんらかの形で隠したり、暗くするという方法があります。PlayStation VRのRIGSなどで採用されています。
ただ、あまり大きく隠すと移動している感覚自体がなくなってしまうため(だからこそ感覚の不一致が起きないのですが)注意が必要です。
コクピットを表示する
自動車や戦闘機、ロボットなどに乗って遊ぶタイプのものでは、コクピットを表示することで酔い低減の効果が得られます。動かないコクピットが視界の基準となり、また、ベクションを生み出す周辺視野の流れを自然な形で隠すことができます。
進行方向のガイドになるオブジェクトを表示する
予測できないカメラ移動があると酔いやすくなります。レールや先行するキャラクター、サイン等、体験者に次のカメラの動きを知らせるものを表示することで、酔いを低減することができます。
一人称視点にこだわらない
一人称視点で自由移動をすると、どうしても激しいカメラの動きになっていまいます。三人称視点にするとゆるやかなカメラ移動にでき、一定の酔い対策になります。好例としてはOculus RiftにバンドルされているLucky’s Taleがあります。
VRゲームは一人称視点でなければ意味がないのでは、という意見もありますが、意外とそうでもないです。疑似体験という面での価値はなくなってしまいますが……。
あえて「酔わせる」
酔い対策は重要ですが、あまりそれにこだわりすぎると手足を縛られてしまいます。全部が全部定点カメラとテレポート移動のようになってしまうと面白くありませんので、あえて、VRゲームは酔うものだ、プレイヤーが慣れて克服するべきだと開き直ってしまう考え方もあります(たとえば戦闘機などは、本物だって酔うじゃないか、と……)。ただ、そういうものを不慣れな方に遊ばせないよう注意が必要です。「このソフトは酔いやすい」ということをあらかじめ表示しておく方法もあります。実際に、Oculus Storeには酔いやすさのレーティング表示があります。
自分の感覚的には、一般の方が多いVR体験会やイベント、店頭デモ等で酔いやすいものを出すのはまずいです。不快感を与えるのはもちろんのこと、「前にVRを試して酔ったからもうやらない」という方が結構いて、そうした人々を増やしてしまいます。3Dゲーム慣れしている人が多いところなら比較的大丈夫かもしれません。
参考文献
Oculus VRから「Oculusベストプラクティス」(日本語/英語)というドキュメントが公開されています。VR酔いの問題を含め、非常に多数のノウハウや注意事項がまとめられていますので、じっくり読んでおいたほうがいいと思います。
また、他にも、酔い対策に関する分かりやすいスライドや記事が公開されていますので紹介します。
- 猫でも分かるOculus警察撃退法
- VR 酔い対策の事例 | GREE Engineers' Blog
- VR酔い防止に向けて。これまで登場したVRでの酔わない移動方法のアイデアまとめ。 | MoguraVR
- 桜花一門流のVR酔い対策
- Unity - Movement in VR
実装編
カメラがロールしないようにするには?
VR酔いを軽減する方法の一つに、水平線を動かさないようにするというものがあります。Unityでは、例えばカメラの親子関係を切って、LateUpdateで視点の向きを加工して追従させます。参考コードです。
using UnityEngine;
public class VRCamera : MonoBehaviour
{
[SerializeField] GameObject viewpoint;
void LateUpdate()
{
transform.position = viewpoint.transform.position;
var angles = viewpoint.transform.eulerAngles;
// ロールとピッチを消す
angles.x = 0f;
angles.z = 0f;
transform.eulerAngles = angles;
}
}
下のような構成にして使います。移動するオブジェクトの子に視点の位置・向きをあらわす空のGame Objectを作り、スクリプトのViewpointから参照します。
カメラのPositionとRotationがRiftの動きで上書きされるため、Main Cameraを空オブジェクトの子にして親のオブジェクトを動かしています。
さらに進めて、視点のぶれ補正などを行ってもいいかもしれません。