plan-4ging

2026/03/21

VR酔いの原因

VR 酔い(サイバーシックネス、Cyber Sickness)の原因は視覚と感覚(内耳)の不一致にある
映像では動いているのに体が動いていないなど、脳が受け取る情報に矛盾が生じることで不快感・吐き気が発生する

視覚 → 「動いている・回転している」
感覚 → 「静止している」
   ↓
脳が情報の矛盾を検出
   ↓
自律神経が反応(吐き気・冷や汗・頭痛)

酔いを引き起こす主な要因

要因具体例
フレームレート不足60fps以下での描画
レイテンシ(遅延)頭の動きに対してカメラ追従が遅れる
人工的な移動プレイヤーが移動していないのに視点が動く
視野角(FOV)の不一致ゲーム内FOVと実際のHMDの視野角がずれている
画面の揺れ・振動揺れエフェクト
加速度の変化急発進・急停止・急旋回

フレームレート/レイテンシ

Motion-to-Photon レイテンシとは

頭を動かしてから画面に反映されるまでの遅延時間
20ms を超えると違和感・酔いが発生しやすくなる

頭の動き検出 → センサー読み取り → ゲームエンジン処理 → GPU描画 → 画面表示
←────────────  Motion-to-Photon レイテンシ ─────────────→
            (目標:20ms 以下)

Reprojection / ASW の活用

フレームレートが目標に届かない場合の補完技術として、Meta Quest の ASW(Asynchronous SpaceWarp) や SteamVR の Reprojection を活用
直前のフレームを補間して見かけ上のフレームレートを維持する仕組み

移動設計

移動設計はVR酔いに最も直結する要素
プレイヤーの身体が動いていないのに視点が移動する「人工的移動」をいかに酔いなく実現するかが大事になる

テレポート移動

スムーズロコモーション(スライド)

スナップターン

UI・カメラ設計

カメラを直接操作しない

VR では HMD がカメラの Transform を毎フレーム上書きする
スクリプトからカメラを直接動かすと HMD の追従と競合し激しい酔いを引き起こす

Camera.main.transform.position += Vector3.up * 0.1f; // NG
Camera.main.transform.rotation = Quaternion.identity; // NG

// OK:XROrigin(カメラの親)を動かす
var xrOrigin = FindObjectOfType<XROrigin>();
xrOrigin.transform.position = newPosition; // 親を動かす

カメラボブ・揺れの禁止

VRではカメラの上下揺れは強烈な酔いを引き起こす
歩行感の演出はコントローラーの振動(ハプティクス)で代替する

// NG:歩行時のカメラボブ
void Update()
{
    float bobOffset = Mathf.Sin(Time.time * bobFrequency) * bobAmplitude;
    cameraTransform.localPosition += new Vector3(0, bobOffset, 0); // NG
}

World Space UI の設計

VRのUIは World Space で実装する

// UI の配置ガイドライン
// ・適切な距離:1.5m〜3m(近すぎると目が疲れる)
// ・視野角内に収める:正面から±30度以内
// ・頭の動きに追従させない(固定 World Space に置く)
// ・追従させる場合はラグ付きで緩やかに追従させる

FOV の固定

VR では FOV(Field of View、視野角)を HMD のデフォルト値から変更しない
FOV を下げると「見えている範囲が狭い」違和感が強くなり酔いを悪化させる

コンフォート設定

コンフォートビネット

移動・回転時に画面周辺を暗くすることで、周辺視野からの移動感を軽減し酔いを抑える

コンフォートオプション

ユーザーによって酔いへの耐性は大きく異なる
設定で切り替えられるようにしておく

□ 移動方式の選択(テレポート/スムーズ)
□ 回転方式の選択(スナップ/コンティニュアス)
□ スナップターンの角度(30°/45°/60°)
□ コンフォートビネットのON/OFF・強度
□ 移動速度の調整

参考