平成28年度 卒業研究中間レポート
遂行機能障害者リハビリ用
VR アプリケーションの制作
近畿大学工学部 情報学科
1
目次 1.研究の背景と目的 1.1.背景と目的 1.2.VR について 1.2.1.VR とは 1.2.2.VR と AR の違い 1.3.Unity とは 2.研究計画 2.1.役割分担 3.現状 3.1.基本操作を理解するため作成したゲームアプリ 3.1.1.Unity 画面構成 3.1.2.ステージの作成 3.1.3.プレイヤーの移動 3.1.4.ランダム移動と衝突判定 3.1.5. 使用した主なイベント関数 3.2.マウスによるオブジェクトのドラッグ移動 3.3.オブジェクトの自動位置調整 4.今後の課題 5.参考,引用2
1.研究の背景と目的 1.1.背景と目的 現在VR は,医療,自動車,教育,宇宙産業など様々な業界で活用されている. 例えば,医療では,VR を診療療法で用いる[1].ルイスヴィル大学の精神科医は,社会不安や 飛行恐怖症などを持つ患者の認知行動療法にVR を利用する.その一つに演説のシミュレーショ ンがあり,これは患者がさまざまな規模の聴衆にさまざまな仮想会場で,まず気が散る要因は加 えず話し,段階的に携帯電話の音や,聴衆からの野次などの注意をそらす潜在的要因を追加して いき克服するものである. 自動車では,VR を試作車の確認で用いる[2].半導体メーカーのNVIDIA は,試作車の確認を VR で行えば,場所の制約から解放されると謳っている.現在自動車メーカーは,試作車をコン ピューター上で作っており,その試作車の品質を確認するため大型のディスプレイを導入し評価 を行っているが,そうしたディスプレイは一部のオフィスにしか導入されていないので,そこに 行かなければならない.そこで,それをVR ヘッドマウントディスプレイ(HMD)に置き換えれ ば,没入感は大型のディスプレイと変わらないので,場所を選ばず試作車の評価ができるわけで ある. 宇宙産業では,VR をトレーニングで用いる[3].米航空宇宙局(NASA)では宇宙飛行士育成プ ログラムにおいて,VR を利用している.このトレーニングは,無重力状態の国際宇宙ステーシ ョンで働く難しさを体験するもので,現実世界とヴァーチャルの世界を同期させ,壁のネジを締 める動作や,人から荷物を受け取ることも可能になっている.さらに,NASA は現在「OnSight」 という火星表面をシミュレートするソフトウェアを開発し,実用化を目指している.これは,探 査機が火星でどのように振る舞うかをシミュレーションし,探査機の遠隔操作でメリットを生む ものである. 英国の投資銀行Digi-Capital の調査によると,2016年における,VR と AR を合わせた世界ビジ ネス規模は,約50億ドルとなる見通しで,2020年には1500億ドル規模に拡大する.また Digi-Capital によると,ここ最近はテクノロジー企業が VR,AR の分野に積極的に投資を行っている[4]. 例えば,米Facebook は,2014年に VR のヘッドマウントディスプレイを手掛ける米 OculusVR を 買収したことや,米Google は AR 技術を使った「Google Glass」を手掛けているほか,VR,AR の新興企業米Magic Leap に出資していることがあげられる. 本研究では,近年注目を集めているVR 向けアプリを Unity というエンジンで開発することを 目的とする. 1.2.VR について 1.2.1.VR とは VR は virtual reality(バーチャルリアリティ)の略で,仮想現実や,人工現実感とも言われて いる.virtual とは,日本語では「仮想」,「現実ではない別の空間」という意味で,reality とは, 日本語では「現実」,「私たちが経験するもの」という意味である. VRは,人間の感覚器官に働きかけ,現実のように感じられる環境を人工的に創り出す技術で ある. 1.2.2.VR と AR の違い VR が目の前にある実際の場面から離れ,完全にデジタル世界の中に身を置くという技術であ るのに対しAR(Augmented Reality)は,目の前の現実の場面にデジタル情報を重ね合わせ表示 する点である. 1.3.Unity とは Unity とは,「総合開発環境」を内蔵し,複数のプラットフォームに対応したゲームエンジ ン である.ゲームエンジンというのは,コンピュータゲームのソフトウェアの主要な処理を代 行 するソフトウェアの総称である.Unity はオブジェクトに物理演算を付加し,プレイしながらリ ア ルタイムで編集できる.スクリプトを書く際のプログラミング言語には C#,UnityScript,Boo を 使用することができる.UnityScript は JavaScript を元にモデル化された Unity 独自設計の言語に3
2.研究計画 5月 Unity でのアプリ作成の流れを「Unity5入門」を読み理解 6月 Metasequoia を使用し,3D モデル作成 7月 Unity でアプリを作成し,C#のイベント関数を学習 8月5日 卒業研究中間レポートの提出 8月20日,21日 大阪キャンパスのオープンキャンパスで使用する AR アプリの完成 9月 遂行機能障害の調査と BADS の動物園地図検査のアプリケーション開発開始 1月 卒論制作 2月 卒業研究発表会 2.1.役割分担 Unity の開発を藤井と協力し研究を進めている.私は VR 向けアプリケーション,藤井は AR 向 けのアプリケーションの開発を目指している.週一回のミーティングで技術や情報を発表するこ とで,直面している問題をアドバイスし合い課題を解決している.例としては,私はUnity でシ ーン移動した際のオブジェクトの位置情報の保持・継承に悩んでいたが,藤井の研究課程で得た 知識を基にアドバイスしてくれ,無事シーン移動した際でも位置情報が失われないスクリプトを 完成.また,藤井がAR で表示させたモデルの移動のスクリプトに悩んでいたが,私のアドバイ スで無事解決し,AR で表示させたモデルが移動するスクリプトを完成させた. 3.現状 はじめにUnity の基本機能で簡単なゲームを作りながら,unity エディタの簡単な使い方を理解し,目 標とするアプリを開発するため,知識を徐々につけている.[5] 3.1.基本操作を理解するため作成したゲームアプリ Unity の基本機能,使い方,スクリプトについて理解することを目的とし,ボールを転がして 黒い球から逃げながら赤い球を捕まえるゲームアプリを作成した. 3.1.1Unity 画面構成 Unity を起動すると以下の図1のような画面が表示される. 図1 Unity のインターフェース Unity の画面は図1の番号のように5つに分けられる. ① シーンビューといい,制作中のゲーム世界が表示され,自由な位置,角度から眺めることができる.4
② ゲームビューといい,カメラを通して見えるゲーム画面が映っている.実際にゲームを作成して出 力 した際にゲームがどう見えるのかをこのビューから確認することができる. ③ インスペクタービューといい,シーン内で選択中のオブジェクトが持つ属性を表示し,編集すること ができる.属性には座標やメッシュといった見た目上のものから,衝突判定や物理制御に関するパ ラメータなどもある. ④ ヒエラルキービューといい,現在選択されているシーン内に配置されているすべてのオブジェクトが 格納されている.各オブジェクトの階層構造を確認,編集することができる.モデル や図形などの素 材をヒエラルキービュー内に追加することでシーン内にオブジェクトとして配置する こともできる. ⑤ プロジェクトブラウザといい,制作中のプロジェクトに含まれるシーン,スクリプト,グラフィック,サウン ドなどのデータがファイル単位で表示される. 3.1.2.ステージの作成まず,地面を作成する.Hierarchy View の Create から3D Object > Plane を作成する.作成 した Plane のPosition を(0,0,0)に,Scale を(2,1,2)にする.
次に,壁を作成する.Hierarchy View の Create から3D Object > Cube を作成し,作成 した Cube の Position を(-0.5,0.5,-9.5)に,Scale を(19,1,1)にする.作成した Cube をコピーし,Position と,Rotation を変 え壁として配置する.
図2 Plane と Cube の作成 3.1.3.プレイヤーの移動
まず操作するプレイヤーを作成する.今回はボールを操作するので,Hierarchy View の Create から3D Object > Sphere を作成する.
次に物理演算のコンポーネントを追加する.コンポーネントとはオブジェクトを構成する部品のことであ り,コンポーネントにより稼働させ,他のオブジェクトに影響をあたえることができる.
まず,Sphere を選択し,Inspector View の Add Component から Physics > Rigidbody を追加する.これ により物理演算の機能が追加され,Sphere オブジェクトが落下する.
最後にプレイヤーであるSphere を操作するためのコンポーネントを作成する.Unity の標準で用意され ていないものは自身で作成する必要があり,C#や UnityScript で記述できる.
まず,Sphere を選択し,Inspector View の Add Component から New Script を選択する.本研究では C#を学習するため,New Script から CSharp を選択し Create する.
以下Sphere にアタッチしたスクリプト using UnityEngine;
using System.Collections;
5
//物理演算で動く度に呼ばれる処理 void FixedUpdate()
{
// 入力をxとzに代入
float x = Input.GetAxis("Horizontal"); //Horizontalは左右矢印キー float z = Input.GetAxis("Vertical"); //上下矢印キー
Rigidbody rigidbody = GetComponent<Rigidbody>(); //押す力を上昇(7倍) x = x * 7; z = z * 7; // rigidbodyのx軸(横)とz軸(奥)に力を加える rigidbody.AddForce(x, 0, z); } } これによりSphere はキーボードの上下左右キーを押すことで,その方向へ力が加わり操作が可能とな る. 3.1.4.ランダム移動と衝突判定 前述したプレイヤー以外の黒と赤の球はランダムで移動し,衝突したときにイベントを起こすことにした. 以下ランダム移動のスクリプト void FixedUpdate(){ float x = Random.value; //x軸 ランダム(0~1.0の値) float z = Random.value; //z軸
Rigidbody rigidbody = GetComponent<Rigidbody>(); x = (x * 10 - 5) * 3; z = (z * 10 - 5) * 3; rigidbody.AddForce(x, 0, z); } Random.value で返されるのは0から1.0の値なので(x * 10 - 5) の計算で-5から5の範囲にしている. 以下衝突判定のスクリプト
void OnCollisionEnter(Collision hit) { if (hit.gameObject.CompareTag("Player")) { イベント; } } これはPlayer という名前のタグがついたオブジェクトと衝突したときにイベントを起こすスク リプトである. 3.1.5.使用した主なイベント関数 現在までに使用したUnity のイベント関数は「Start」,「Update」,「FixedUpdate」,「Awake」, 「OnMouse」,「OnColliosionEnter」,「OnDestroy」である.「Start」は Update が呼び出される前の フレームで呼び出される関数であり,スクリプト内で1回のみ呼び出される.「Update」は1frame (画像の描画単位)ごとに呼ばれる.ただし,描画の間隔は処理能力に依存するため一定ではな い.「FixedUpdate」は,固定のインターバルで呼ばれる関数で,デフォルトでは0.02秒毎に呼ば れる.「Awake」は,スクリプトがロードされたときに呼ばれる.「OnMouse」はマウスによって
6
呼び出される.現時点では「OnMouseDown」,「OnMouseDrag」,「OnMouseUp」を使用したこと があり,順に,マウスの左ボタンが押されているとき,マウスをドラッグしたとき,マウスの左 ボタンが押され戻るとき呼ばれる.「OnColliosionEnter」は,3.1.4の衝突判定のスクリプトのよう に,OnColliosionEnter をアタッチしたオブジェクトが指定したあたり判定を持つオブジェクトに 衝突したときに呼び出される. 図3はイベント関数の呼び出し順をフローチャートにしたもので,このフローチャートから,使用した7つのイベント関数を呼び出される順に並べると,Awake → Start → FixedUpdate → OnColliosionEnter → OnMouse → Update → OnDestroy となる.
7
3.2.マウスによるオブジェクトのドラッグ移動 下記アタッチしたスクリプト
using UnityEngine; using System.Collections;
public class MouseDrag : MonoBehaviour {
//Vector3は,与えられた x,y,z 成分で新規のベクトルを作成する private Vector3 screenPoint;
private Vector3 offset; void OnMouseDown() { //カメラから見たオブジェクトの現在位置を画面位置座標に変換 screenPoint = Camera.main.WorldToScreenPoint(transform.position); } void OnMouseDrag() { //ドラッグ時のマウス位置をシーン上の3D 空間の座標に変換する
Vector3 currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint); //オブジェクトの位置を変更する transform.position = currentPosition; } } オブジェクトをクリックしたときのスクリーン上のマウスの座標を,Unity の世界座標に変換 し,ドラッグしたときにマウスにオブジェクトがついていくように移動させている.つまり WorldToScreenPoint は,ワールド座標をスクリーン座標に変換している.Unity のワールド座標と は,3D 空間内の座標のことであり,スクリーン座標とは,解像度と一致し,画面左上が0である. このスクリプトにあるtransform.position は,transform.position =;の形で,代入した位置座標へ アタッチしたオブジェクトを移動させる. 3.3.オブジェクトの自動位置調整 マウスのドラッグでモデルを移動させるものを,指定の範囲内にモデルが移動すると自動で位 置を修正するようにする.3.2のスクリプトに private static Vector3 pos; と,void OnMouseUp() を 追加し,OnMouseDrop() 内に pos = currentPosition;を追加する.そして void OnMouseUp()に pos の 座標はオブジェクトを置いた位置の座標となるので,if 文で範囲内の座標にオブジェクトを置い た場合,指定した場所へ移動させるとする.
下記if 文の例
if (-0.5 <= pos.x && pos.x < 0.5){ if (-0.5 <= pos.z && pos.z < 0.5)
transform.position = new Vector3(0, 0, 0); if (0.5 <= pos.z && pos.z < 1.5)
transform.position = new Vector3(0, 0, 1); if (1.5 <= pos.z && pos.z < 2.5)
transform.position = new Vector3(0, 0, 2); }
4.今後の課題
現在,BADS 遂行機能障害症候群の行動評価のうちの動物園地図検査を VR アプリにしようと
8
で現実に近い状態になり,遂行機能障害の方のリハビリテーションにも効果が期待できるのでは ないかと考えているが,現状分からないため,今後,遂行機能障害及び高次脳機能障害について 調査することが必要である.
5.参考,引用
[1] The Wall Street Journal 「治療ツールとしての仮想現実」
<http://jp.wsj.com/articles/SB12416273766489574789704581260381354176842 > (2016/8/03 アクセス) [2] Car Watch 「プロ向け VR が,自動車の試作や自動車ディーラーの展示を変える」 <http://car.watch.impress.co.jp/docs/event_repo/gtc2016/752489.html > (2016/8/03 アクセス) [3] mogura VR 「ハイブリッド・リアリティによる NASA の宇宙飛行士育成プログラム.VR で宇宙の作業環境を再現.」 <http://www.moguravr.com/nasa-hybridreality/ > (2016/8/03 アクセス)
[4] Digi-Capital 「Augmented/Virtual Reality revenue forecast revised to hit $120 billion by 2020」 <http://www.digi-capital.com/news/2016/01/augmentedvirtual-reality-revenue-forecast-revised-to-hit-120-billion-by-2020/#.V53tAmzsI0T