東京ゲームショウ 2015, 2016 から見る VR 業界の急速な成長

東京ゲームショウ 2016 に行ってきた。東京ゲームショウ 2015 と 2016 の VR 業界の差分を自分が感じた範囲で紹介しようと思う。

東京ゲームショウ 2015 の VR

2015 年も VR 系の展示はあったものの、ハコスコなどで 3D 空間を表示してジャイロセンサーで頭の動きをトラッキングしてカメラの回転を反映させている程度だった。 Oculus も展示していたようだが自分が見ていなかったのでここの部分は不明。

2015 年の VR は 3D の CG をどのように表示するかという部分にフォーカスされていたように思う。また、2015 年は個別のゲームで VR 対応しているものを展示しており、展示場所が点在していた印象。

東京ゲームショウ 2016 の VR

今年のゲームショウではまず、初日の基調講演が “VRマーケットの展望” から始まり、 VR 専用の展示ゾーン (9-11) が大きく設けられていた。また PSVR や HTC Vive, FOVE などのメジャーどころが出展しており、それぞれの整理券がすぐに完売していた。展示エリアに占める VR の割合が大幅に増えた。

展示の中身も大きく変わり、今年は VR 空間内で 3D 空間を表示するのに加え、ユーザーのインプット、フィードバック方法を変えるアプローチが多くされていた。以下に自分が試せたものを紹介していく。

Rez Infinite VR

電気刺激を様々箇所に受ける独自のスーツ (Synesthesia Suit) を着て体験するアプリケーション “Rez Infinite VR” が出展しており、運良く体験することができた。

Synesthesia Suit

音楽に合わせて微弱な電気刺激が与えられ、ダメージを受けた時に全身に電気刺激が与えれるなど、非現実的な空間だが非常にリアルに感じた。二人がかりで装着が非常に大変そうで申し訳ない気持ちになったが、ゲームショウで体験した中で一番面白いアプリケーションだった。

HTC Vive

既にご存知の方も多いと思うが、空間内移動を可能にする HMD である HTC Vive が出た。移動できる範囲は最大で 5m 四方程度。 5m 内で移動が完結できるパターンは少ないので、それぞれのアプリケーションでは The Lab のように空間内でワープできる実装が施されている。

3DRudder

ルンバのような形の足で操作するタイプのコントローラー 3DRudder が出展されていた。足の力のかけ方で移動方法をコントロールできる。

FUTURETOWN

FUTURETOWN では馬乗り型、バイク型、足で操作するタイプのコントローラーを展示していた。コントローラーでありながらフィードバックも同時に受けることができる。VR 空間内でカメラを勝手に移動するのは VR 酔いにつながって良くないとされているが、ユーザーのインプットとフィードバックを両方得られるコントローラーなので、移動時にも自然な映像に見えた。

馬乗り型のアプリケーションは試さなかったが鳥に乗って空を飛ぶシーンがあり、それが実際どれくらい自然に感じるのか試してみたかった。

FOVE

視線をトラッキングするタイプの HMD。 目の動きで VR 空間内のモノを操作するアプリケーションが可能になる。最近 FOVE 以外でも Oculus などに装着できるタイプの視線トラッキングカメラが販売されており、非常に楽しみな領域。

他にも

他にも非常に面白そうな展示があったが、展示エリアに置いてある HMD の台数と人の数のバランスが合わないよくある問題で、どこも行列になっていて半分も試せなかった。

まとめ

ゲームショウ 2015, 2016 の一年間で、ゲームにおける VR が非常に大きく成長していると感じた。見る、聞くだけでなく、動くや感じるなどの感覚が加わり、見ることに対してもそれに対するフィードバックが得られるようになった。

Unity で VR モード時にカメラの位置を固定する

Unity で VR モードにして Oculus Rift, HTC Vive などのヘッドマウントディスプレイでプレイすると、自動的に hmd とセンサーとの距離からカメラの位置が動く。

これは、 Unity 公式ドキュメント:VR 概要 の “カメラを理解する” のセクションに記載されている。

カメラの Transform は、ヘッドトラッキングされた姿勢で上書きされます。

カメラの位置 (position) は固定して回転 (rotation) のみ有効にしたい場合がある。そのためには、カメラの親となるゲームオブジェクトにカメラの動きを無効化するための処理を加える必要がある。

もしもカメラを動かしたい場合は、別のゲームオブジェクトの子としてアタッチし、そのゲームオブジェクトのルートを動かしてください。

Unity の VR モードでカメラの位置を固定してみる

Unity VR モードのカメラを固定

今回は CameraController という空のゲームオブジェクトを配置し、その中に Main Camera を挿入した。CameraController にスクリプト CameraController.cs を Add Component した状態。

スクリプトの中身は以下のようにする。

CameraController.cs

using UnityEngine;
using UnityEngine.VR;
using System.Collections;

public class CameraController : MonoBehaviour {

void Update () {
    // TODO: ここで固定したい位置があれば指定しておく
    Vector3 basePos = Vector3.zero;

    // VR.InputTracking から hmd の位置を取得
    Vector3 trackingPos =
            InputTracking.GetLocalPosition(VRNode.CenterEye);

    // CameraController 自体の rotation が
    // zero でなければ rotation を掛ける
    // trackingPosition = trackingPos * transform.rotation;

    // 固定したい位置から hmd の位置を
    // 差し引いて実質 hmd の移動を無効化する
    transform.position = basePos - trackingPos;
}

}

CameraController の position に、固定したい位置から VR.InputTracking のポジションを引いた値を代入している。 Update メソッドに処理を書くことで常に hmd の動きを無効化するようにしているが、初期位置のみ固定したい場合は Start メソッド内に処理を移動すればオッケー。

また、ローテーションを無効化したい場合も同じように固定したい rotaiton との減算を行えば大丈夫。

補足

位置固定はできるが、実際にこれで Oculus, Vive などでプレイすると実際の動きとの差で VR 酔いを起こしてしまうかもしれない。自分の場合は少し気持ち悪さを感じたので、本番のプロジェクトでは導入しない予定。

特定のケースに限定して、同しようもない場合にこのような実装にしたほうが良いと思う。また、 Unity で位置やローテーションの無効化をサポートしそうな気もするので最新情報をキャッチしてから組み込んだほうが良いかも。既にあったりしたら教えてください。

Unity x HTC Vive で The Lab のようなワープを簡単に実装する

Unity x HTC Vive で The Lab みたいに簡単にワープできないかと、色々と模索していたら意外に簡単にできたので忘却録の意味も込めて記事にする。

流れは以下の通り。以下の流れの前に PC で Vive が動作している & Unity の VR 設定ができていることを前提に記述する。完成したサンプルは https://github.com/tanabee/ViveTeleporter にて入手。

  1. SteamVR Plugin を Unity にインポート
  2. Hierarchy パネルに CameraRig を配置
  3. Main Camera を Deactivate or 削除
  4. Laser Pointer と Teleporter を Controller に Add Component

1. SteamVR Plugin を Unity にインポート

SteamVR Plugin を Unity の Asset Store タブなどからダウンロードしてインポートする。

これが現状では HTC Vive 対応するための標準ライブラリらしい。

Unity で Asset Store タブを選択
Unity で Asset Store タブを選択。

Asset Store で SteamVR Plugin を探す
Asset Store で SteamVR Plugin を探す。ダウンロードボタンをクリック。

SteamVR Plugin の import
SteamVR Plugin のダウンロードが完了すると import を求められるので import をクリック。

Steam VR Plugin のダイアログ
ダイアログが出るので、とりあえず Accept All しとく。

2. Hierarchy パネルに CameraRig を配置

Project パネルの SteamVR > Prefabs 以下に [CameraRig] というプレハブがあるので、これをドラッグして Hierarchy パネルにドロップ。

SteamVR/Prefabs/CameraRig を見つける
SteamVR/Prefabs/CameraRig を見つける

SteamVR/Prefabs/CameraRig を Hierarchy パネルにドロップ
SteamVR/Prefabs/CameraRig を Hierarchy パネルにドロップ

この中にカメラと左右のコントローラが含まれている。この状態でビルドすると

3. Main Camera を Deactivate or 削除

Main Camera が不要であれば削除する。Oculus などの他の端末のために残して、 Vive 用だけこのカメラを利用する場合には Deactivate する。

この状態でビルドすると、Vive の hmd を装着して Scene ファイル内の映像が見えてコントローラーが表示されているはず。

4. Laser Pointer と Teleporter を Controller に Add Component

SteamVR/Extras/ 以下の SteamVR_LaserPointer と SteamVR_Teleporter を CameraRig 以下の Controller に Add Component する。SteamVR_Teleporter の Teleport On Click にチェックを入れるとトリガーを引いた時にレーザーがあたっている Y=0 のポイントに移動する。

CameraRig 以下の Controller を選択
CameraRig 以下の Controller を選択

SteamVR_LaserPointer と SteamVR_Teleporter を Add Component
SteamVR_LaserPointer と SteamVR_Teleporter を Add Component

まとめと補足

以上で Vive でコントローラーを表示し、ビームが出て、ビームと Y=0 の設置点に移動できるようになった。さらに進んで背景の地面の高さに合わせた設定をするためには、 Telepot Type を変更して背景オブジェクトのコライダーを設定すれば良さそう。

また、この Camera Rig を 特定のゲームオブジェクト内に挿入するとそのゲームオブジェクトの回転の影響でビームが逆に出たりするのでその場合には親のゲームオブジェクトの rotation を考慮して内部のコードをいじればいけた。(が、美しい方法ではないのでいい方法があれば教えて欲しい)