怖いVRコンテンツの作り方（入門）

この記事は[「NTTテクノクロス Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/ntt-tx)の20日目の記事です。
執筆は<a href="https://www.ntt-tx.co.jp/?utm_source=qiita&amp;utm_medium=ac2018&amp;utm_campaign=20" rel="nofollow noopener" target="_blank">NTTテクノクロス</a>の江崎(esaken2)です。
#はじめに
VRを使ったサービスは日々増えており、事故防止などのためにVRを活用するといったアプローチも２０１６年ごろから一般化し、いまではたくさんの製品や事例があります。
今からVRの勢いに乗りたい。簡単に始められるらしいから勉強したい！というかた向けに
Unityでコンテンツを作成する触りとVRの原理、特に「怖い」と体験してしまう、錯覚に触れながら実際の作成手順を紹介したいと思います。

VRコンテンツをすでに作ったことがある、VRの原理はしっている。
という方は再確認。という気持ちで読んでいただければと思います。
#準備
Unityを使って簡単なVRコンテンツ作成を紹介するためUnityがインストールされたマシンを用意していることが前提です。
ダウンロード先はこちら　https://unity3d.com/jp/get-unity/download
Unityはゲーム開発用環境ですが、VR機器上で動くプログラムを作るためのソフトをインポートすることで簡単にVR対応することが可能です。
また、今回はHTC VIVEでVRプログラムを動作させるため、SteamというValveのデジタルゲーム配信サービスから、SteamVRなどの環境をセットアップしておきました。
https://www.vive.com/jp/support/vive/category_howto/setting-up-for-the-first-time.html
#この記事で紹介すること

- 「物体との衝突」「高所からの転落」を体感するための簡単なVRプログラム
-  つくったVRプログラムの簡単な原理（視覚・脳科学的）

#【VRプログラム作成の準備】
それではまず、Unity上でVRプログラムを作成するために、Unityストアから、SteamVRアセットを自分のプロジェクトにインポートします。
準備でインストールしたUnityを立ち上げ、新規プロジェクトを作成します。
プロジェクトの画面が表示されたら「AssetStoreタブ」にうつり「SteamVR」と入力しアセットを検索します。
ダウンロードのボタンをおし、インポートまで行います。
![1_SteamVRImport.png](https://qiita-image-store.s3.amazonaws.com/0/318625/cac40305-b3f8-15f6-564b-28ee37efdc0b.png)
![2_SteamVRImport_check.png](https://qiita-image-store.s3.amazonaws.com/0/318625/4e912418-23d9-a39d-70c7-a6d782c4146a.png)
SteamVRがインポートされたら、SteamVRフォルダの中にあるPreHubを自分のプロジェクトに配置します。
![5_SteamVRImport_prefub.png](https://qiita-image-store.s3.amazonaws.com/0/318625/f4d6ce6c-893a-4460-eee1-cab470cf81a1.png)

スタートを押してVRプログラムが動作したら準備完了です。
VRプログラム作成の後に、VRの原理を紹介しています。見えているVRプログラムがなぜ立体的に知覚されるかを知りたい方は、[VRの原理（両眼視差）](https://qiita.com/esaken2/private/36af5a9f2f7710dfd6e6#vr%E3%81%AE%E5%8E%9F%E7%90%86%E4%B8%A1%E7%9C%BC%E8%A6%96%E5%B7%AE)、を読んでください。
#物体との衝突　VRプログラムの作成①
つぎに、物体との衝突を体感するプログラムを作成していきます。
Unityはゲーム空間内にオブジェクトを配置し、そのオブジェクトに様々な特性を付与し、リアルタイムにシミュレーションするゲームを簡単に作れると考えてください。
今回は、球をVRプログラム内に配置し、重力の影響を受け上から下に自由落下する特性を付与、してみます。

まず、Seneのなかに球を配置してみます。CreateからSphereを選択し球を追加します。
![7_object_sphere.png](https://qiita-image-store.s3.amazonaws.com/0/318625/cd003097-5f53-7936-dfbd-9e7d7a648ba9.png)
![8_object_sphere_obj.png](https://qiita-image-store.s3.amazonaws.com/0/318625/96c6346c-6019-fe09-bcc9-54193145f63b.png)
追加した球はScene画面のUIか、画面右Windowに表示されているInspectorから位置などを変更することができます。
![9_object_sphere_up.png](https://qiita-image-store.s3.amazonaws.com/0/318625/c6d95b67-94d0-9fca-3051-d73ce81f508e.png)
今は画面の上（y座標を100程度まで上げてみます）へ移動させてください。このままだとその位置に球は静止しつづけます。
そこで、AddComponentをクリックし、重力の影響をうけるよう、Physicsのrigidbodyを加えます。
![11_object_sphere_up_10_addcomponent.png](https://qiita-image-store.s3.amazonaws.com/0/318625/af524863-1216-1d27-d4fb-3e3306493f12.png)
![12_object_sphere_up_10_addcomponent_rigidbody.png](https://qiita-image-store.s3.amazonaws.com/0/318625/70c62503-ed89-0bc7-8cf7-6e456389e70a.png)
UseGravityにチェックが入っていると、y軸方向に落下をします。
![13_object_sphere_up_10_addcomponent_rigidbody_useGravity.png](https://qiita-image-store.s3.amazonaws.com/0/318625/f5ce888a-6930-ab90-5565-88511cab75a0.png)
これで球の真下にいる場合、上から落ちてきたものに衝突するプログラムを書くことができました。
![sphere_gif.gif](https://qiita-image-store.s3.amazonaws.com/0/318625/0bdca46e-ee76-2cec-56ca-dc4bf6ae90b9.gif)

衝突を感じるときのVRの原理は、[VRの原理（姿勢反射）](https://qiita.com/esaken2/private/36af5a9f2f7710dfd6e6#vr%E3%81%AE%E5%8E%9F%E7%90%86%E5%A7%BF%E5%8B%A2%E5%8F%8D%E5%B0%84)を読んでください。


#物体との衝突　VRプログラムの作成②
それでは、次に正面から立方体が突っ込んでくる、というVRプログラムを次は作ってみましょう。重量の向きを変える。などやり方はいくつか考えられますが、物をスクリプトで動かす方法を使います。
UnityはC#で書いたスクリプト（プログラムで記述した命令）でリアルタイムにゲームを変化させることができます。

```C#:Code/MoveScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//Transform.position example

public class MoveScript : MonoBehaviour
{
   private Vector3 changePosition;

   void Update()
   {
      //Move sphere straight
      changePosition = new Vector3(0.1f,0.0f,0.0f);
      transform.position += changePosition;
   }
}
```
スクリプトにある、Updateメソッドに記載した内容は毎フレーム実行され動作します。
Unity上のオブジェクトは様々なプロパティをもち、位置はpositionになります。x,y,z で指定できますが、今回はxを変化させるスクリプトをになります。こちらは、毎フレーム0.1だけ位置を動かす命令になります。
これからこのC#スクリプトを立方体に特性として付与します。
まずは、createからcubeを選択し配置します。
次にcodeに配置したスクリプトをドラッグしcubeに重ね、componentとして付与します。
![16_add_moveScript.png](https://qiita-image-store.s3.amazonaws.com/0/318625/006894f0-a663-5231-3db0-da6cf99373fc.png)
スタート位置をx:-30にして、再生したら立方体が飛び込んでくるVRプログラムの完成です。
![cube_gif.gif](https://qiita-image-store.s3.amazonaws.com/0/318625/43e9379c-2b43-08e0-bc5e-2477eaa6a993.gif)

#高所からの転落　VRプログラムの解説
高所からの転落は、物体の移動をSteamVRのプレハブ、具体的にはCamerarigを動かすことで、自分の視点を動かすことになります。
![6_SteamVRCameraRig.png](https://qiita-image-store.s3.amazonaws.com/0/318625/172cfd9b-9982-cb1f-1cdd-fdb527cc9fca.png)
解説にもありますが、衝突の場合自分の視野に一定以上接近した物体は姿勢反射で避けようと怖いを錯覚できますが、Unityの初期配置であるような広大な空間上で移動をしても、運動感覚の錯覚は発生することがありません。そのため、距離感を把握する物体をUnity中に配置して自分がどのようにうごいているか知覚する必要があります。
試しに、雲をたくさん配置して自分が移動した方向や速度を認識できるようにすると高さや速さを知覚し怖さを感じることができます。
![move_cloud.gif](https://qiita-image-store.s3.amazonaws.com/0/318625/926573d7-a33d-d747-408c-fe2d2cbf1836.gif)

自分が動いていると錯覚し、落下や移動に関する怖さを感じる場合は、[VRの原理（錯覚：ベクション）](https://qiita.com/esaken2/private/36af5a9f2f7710dfd6e6#vr%E3%81%AE%E5%8E%9F%E7%90%86%E9%8C%AF%E8%A6%9A%E3%83%99%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)を読んでください。

#最後に以下にVRの原理についてまとめます。

##VRの原理（両眼視差）
以下はWikipediaにのっている両眼視差を説明した図になっています。
![両眼視差.png](https://qiita-image-store.s3.amazonaws.com/0/318625/086f437a-df66-f1d8-81db-1197726c24f5.png)
物体を見るとき、右目と左目で異なる画像を見ていますが、この違いから立体感などを認識しています。UnityではSteamVRのアセットを配置するときに、カメラを２つおき、左目像と右目像をリアルタイムに計算しVRヘッドセット上に表示することで３次元空間の視覚体験を提示しています。
２Dのテレビで物体が近づいてくるときよりも、VRの方がより高臨場に距離感を感じることができるため、ものが超近距離に迫ってくる感覚や景色が流れ自分が移動している感覚の錯覚を産むことができます。（ここでいる錯覚とは、物理空間上で本物の物体が動いていないため、錯覚と読んでいます。）

[両眼視差wiki](https://ja.wikipedia.org/wiki/%E4%B8%A1%E7%9C%BC%E8%A6%96%E5%B7%AE)

##VRの原理（姿勢反射）
動物の神経は脊髄反射のように、知覚したあと認知する前（もしくはほぼ同時）に身体が反応するケースがあります。今回の場合、危険を感じのけぞったりしようとする反射（姿勢反射）が起きる状況です。今回のVRコンテンツの場合は、姿勢反射が起きるほど高速で物体が至近距離に接近することで、視覚情報から判断し心拍数や冷や汗がでたりすることもあります。
[脳と神経の科学](https://www.amazon.co.jp/%E7%B5%B5%E3%81%A8%E3%81%8D-%E8%84%B3%E3%81%A8%E7%A5%9E%E7%B5%8C%E3%81%AE%E7%A7%91%E5%AD%A6-%E5%B0%8F%E6%9E%97-%E7%B9%81/dp/4274131149)

##VRの原理（錯覚：ベクション）
「バーチャルリアリティ学　P.32」に記載されているベクションを表す図をみると、ものが遠ざかる映像をみて、物体に近づく動きを錯覚することを示しています。

[バーチャルリアリティ学](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E5%BB%A3%E7%80%AC-%E9%80%9A%E5%AD%9D/dp/4769351380)