Download - Kansai cedec 2015_okude
スマートフォンのセンサーをUnityでつかう
2
講師自己紹介奥出成希(Seiki Okude)
• フリーランスのプログラマー• 専門学校の講師
2
3
この世の中はセンサーであふれている
• 自動ドア• 湯沸かしポット• テレビのリモコン• 防犯センサーライト• エアコンの温度調整
4
スマートフォンのセンサーは多彩
• 3軸加速センサー、ジャイロスコープ• GPS、デジタルコンパス、気圧• カメラ、マイク、近接センサー• タッチパネル、物理ボタンなどなど
5
デバイスの中と外をつなぐもの
外の状況を読み取りデバイス内に伝えることで、その状況に応じた処理を行うことが出来る
6
なにか使って、作ってみよう
今回の例• バーチャルスノードーム• ヘッドマウントディスプレイの中身+立体視• ロケーションベースAR
7
バーチャルスノードーム• スマートフォンの中でスノードームを再現する
• デバイスの傾きで中の雪が動く
• 球状のガラス表現は難しそうなので作らない
• 固定オブジェクトも置きたい
8
これを作ったきっかけ● Unityでスマートフォンのアプリを作るという講義のネタだった
● 授業の中で重力を弱めたいという質問が出た● 設定項目は図の部分● Gravityの項目はVector3だった● yの値をプラスにしたら上に「落ちる」、xに設定したら横に「落ちる」、とうぜんzに設定したら前後に「落ちる」わけですね
● 重力を操作するゲームとか面白いかな
● デバイスを傾けても重力の方向が現実と一致してたら面白いな
9
使うセンサーは3軸加速センサー
• Wiiリモコンのセンサー• その名の通り、加速を検知• だいたいのスマートフォンには搭載されている• デバイスの加速(移動)を三次元ベクトルで得る• 静止状態で重力の方向を検知• 重力無視したければハイパスフィルタで除去
10
設計
• Boxコライダのみを持つオブジェクトを床天井壁にする
• 重力の影響を受けるオブジェクトを雪に見立てる
• 重力の影響を受けないオブジェクトも配置する• 三軸加速センサーからの値をUnityの物理エンジンの重力の方向に設定する
11
プロジェクトの配置ドームの作成• 空のGameObjectにBoxコライダーを追加しそれを板状に変形
• それを6つコピーして中空のキューブ状に配置する
雪の作成• キューブを雪の粒に見立てて小さめに作る
• Rigidbodyを仕込んで、Mass小さめにしておく
• Use Gravityチェックして重力で落下するように
• ドーム内にたくさんコピーしておく
12
スクリプトvoid Update () {
Physics.gravity =
new Vector3(
Input.acceleration.x,
Input.acceleration.y,
Input.acceleration.z * -1
);
}
13
実演
14
固定オブジェクトを置きます• Unityちゃんパッケージimportして配置します
• アニメさせません• Boxコライダをこのポーズに仕込みます
• キラキラはこのコライダに当たります
15
実演
16
これだけじゃつまらないのでさらに追加
• 背景にカメラ画像をはめ込む• 忘れがちですが、カメラも立派なセンサー
17
WebCamTexture
• カメラの映像をテクスチャとして使える• 使い方は超簡単• WebCamTextureのインスタンス作って、それをマテリアルのMainTextureに割り当てて、Play()を呼ぶだけ
18
プロジェクトの配置• 通常のオブジェクトたちとは違うレイヤーに配置する(webcamという名前にしておく)
• 平行投影カメラを設置• webcamレイヤーのみを映すように設定• 通常のカメラはdepthを-1に、webcamのカメラは-2に設定(つまり向こう側に置く)
• 通常カメラはClearFlagsをDepthOnlyに、webCamはSolidColorで黒塗りつぶし
• Quadオブジェクトを横縦比4:3の大きさで置く
• このオブジェクトがwebcamのスクリーンになる
• ちょうど画面に収まるように画角調整• Unlit/Textureのテクスチャ無しでmaterialを作成、割り当て
• 光源の影響を受けないようにしたい
19
スクリプトWebCamTexture webcamTexture = null;
public Transform cameraScreen;
void Start () {
WebCamDevice[] devices = WebCamTexture.devices;
if (devices.Length > 0) {
webcamTexture = new WebCamTexture (320, 240, 12);
cameraScreen.renderer.material.mainTexture = webcamTexture;
webcamTexture.Play ();
} else {
Debug.LogError ("no camera");
}
}
20
実演
21
仕掛け部分だけをGitHubで配布しています。あとは自分で実装してみてください。
https://github.com/sokude/VirtualSnowdome
22
ヘッドマウントディスプレイの中身+立体視
• ある場所でOculusRiftをかぶってみた• とても感銘を受けたが買って開発は今すぐは無理
• でも立体視でぐるぐる周囲を見てみたい
23
じゃあ裸眼立体視でつくってしまえ
24
一晩で作りました
と言いたいところですが二晩かかりました
25
設計
• 裸眼立体視はカメラを2つ配置して左右少しだけ位置をずらす
• その2つのカメラのスクリーンをビューポート設定で左右に配置
• 2つのカメラの親になるカメラルートオブジェクトを設定
• ジャイロの値とこのカメラルートの向きを連動させる
26
立体視とは
• 左右の目でそれぞれ少し位置のずれた画像を見せることにより、奥行き感を脳に錯覚させる
• OculusRiftのようにヘッドセットで強制的に分ける• Nintendo3DSのような視差バリア• ステレオグラム画像のように自力でがんばるなど
★今回は自力でがんばってみましょう
27
まずは裸眼立体視を実現しておこう• 背景などを配置
• アセットストアから墓場の背景セットをimportして使わせていただく
xiaolianhuastudio / Make Your Fantasy Game - Lite
28
まずは裸眼立体視を実現しておこう
2台のカメラは左右に座標が少しずれているビューポート設定で左右に画面分割
図のように左右にカメラを2台配置(真ん中は画面外塗りつぶし用)
29
ゲームビューはこんなふうになります
裸眼立体視はできました
30
ジャイロスコープとは
• WiiリモコンプラスとかSixAxisとか• デバイスの姿勢を検出• UnityではQuaternionで取得できる
31
ジャイロスコープを使う● GameObjectをジャイロか
らのデータを処理する入れ物とする
● gyroScriptがCameraPrefab
の方向を制御する
● ジャイロスコープから現在の端末の回転角を取得して、カメラオブジェクトの向きにほぼそのまま放り込む
32
スクリプトpublic Transform target; //cameraset
// Use this for initialization
void Start () {
if (SystemInfo.supportsGyroscope) {
Input.gyro.enabled = true;
} else {
Debug.Log ("no support gyro.");
}
}
// Update is called once per frame
void Update () {
if (Input.gyro.enabled) {
Quaternion qqq = Input.gyro.attitude;
qqq.x *= -1;
qqq.y *= -1;
qqq.z *= 1;
target.localRotation = qqq;
}
}
33
実演
34
ちょっと追加要素
• せっかくなのでUnityちゃんにもう一度登場していただきましょう。
• VirtualSnowdomeと同様にパッケージをimportする
• カメラからさほど離れていない場所に配置• 今度はアニメーションをさせておく
35
実演
36
妄想全開、Unityちゃんと墓場デート
これもかんたんでした。
37
仕掛け部分だけをGitHubで配布しています。あとは自分で実装してみてください。
https://github.com/sokude/stereogram
38
今後の課題
• 裸眼立体視はそれなりに人間的に疲れる• ゲーム内の空間を移動する術がない• 画面にタッチすることすらおぼつかない
→素直にヘッドマウントディスプレイ→Bluetoothコントローラで操作
39
この技術が向いているもの
GPSやカメラと組み合わせてみる→ロケーションベースAR的な展開
(ただし立体視とは相性悪そう)
屋内測位システムと組み合わせてみる→アミューズメント施設のアトラクション的なもの
40
GPSを使ったロケーションベースAR
• AR(拡張現実)– 現実環境をコンピュータにより拡張する技術
• ロケーション情報– GPSやWiFi、携帯電話基地局情報などから地球上の現在位置を取得する
• ロケーション情報とARを組み合わせる– ARとして現実環境に付け加える情報を位置情報から生成する
41
概要
• 緯度経度で指定した場所に3Dモデルを置く• 端末のGPSから取得した現在位置の緯度経度と照らし合わせる
• あたかもその3Dモデルが現実に存在しているかのようにカメラ画像と合成して表示する
※立体視は行わない
42
使用するセンサー
• カメラ• ジャイロスコープ• GPS
• 地磁気センサー(デジタルコンパス)
43
設計• GPSで得られる緯度経度の情報をゲーム空間上のX座標Y座標に見立て、
カメラオブジェクトの位置を決定する。
• 同様に3Dモデルもその平面上に緯度経度を模した値で配置する。
• 最遠景には背面カメラからの映像をリアルタイムで表示しておく。
• ジャイロスコープとデジタルコンパスにより、カメラオブジェクトの
回転(視線方向)を制御する。
• こうすることによってユーザー現実世界での移動とゲーム内カメラが
連動し、ゲーム内の仮想空間と現実の空間をつなぐことができる。
44
問題点地球は球体なのでゲームの仮想空間の地上とマッピングした時に誤差が出る。広いエリアでは問題になるがこの誤差が許される範囲での運用を前提にしている。
45
プロジェクト配置● 「バーチャルスノードーム」と同じようにWebCamTextureを使い最遠景にカメラ画像。
● 「ヘッドマウントディスプレイの中身」と同じようにジャイロスコープで動くゲーム内カメラオブジェクト(ただしカメラは1つ)
● 表示物:なにか3Dモデルとか、看板とか
46
スクリプト※Update()内、PlayerObjはジャイロカメラ
playerObj.eulerAngles = new Vector3 (0, cameraRot, 0);
// 現在の位置を取得.
nowpos.x = Input.location.lastData.longitude;
nowpos.y = 0.00002f;
nowpos.z = Input.location.lastData.latitude;
//起動時の位置からの相対座標にする
playerObj.transform.position = (nowpos - locationOffset) * 1000;
// 表示オブジェクトの位置も相対座標にする
47
コンパス使ってない?• ジャイロのY軸回転と合わせて端末の向いている方角を取得するために使うはずだった。
• ところが、Unity/AndroidではジャイロのY軸回転の0位置がコンパスの北に一致していた。
• 全部の端末でそうなるのかは検証しきれないが、少なくともNexus4と7では問題なかった。実際にこの仕組みでアプリをリリースしたが不具合は報告されていない。
• 内部的にコンパスは使われているかもしれないがUnityのプロジェクトからは意識しなくてもいい。
48
コンパス使ってない?• Unity/iOSではジャイロのY軸回転はジャイロをenableにした
時の向きを起点にしているようで、コンパスの北と一致しなかった。
• この場合はジャイロをenableにするのと同時にコンパスの値を取得してY軸回転の値に足す。
49
実演
50
まとめ
本日3点の実装例を紹介したわけですが…
51
据え置きゲーム機とセンサーコントローラー以外の入力デバイスのゲームはイマイチ流行らない• キネクトやPlaystationMoveは微妙だった• 例外:Wiiリモコン、WiiFit
• Wiiはあれが売りで全面に押し出した• WiiFitは体感モノとしてゲームとは違う分類にすべき• なぜかWii以外の場合、遊んでいるのを見られるのがちょっと恥ずかしい(あくまで私の印象)
• 緻密な入力を要求するゲームはいわゆるコントローラー以外のデバイスでは無理がある
52
モバイルゲーム機とセンサー3DSのジャイロを使ったゲーム• 視差バリア方式の立体視とモーションコントロールの相性は最悪• New3DSで劇的に改善
AndroidやiPhoneではどうか?• ソーシャルゲームなんかではモーションコントロールがゲームの中核となり得ることはなさそう– ガッツリ遊んでいる人ならまだしも空き時間とか移動中に本体振り回して遊ぶか?
• GPSは例外的に「位置ゲーム」と呼ばれるジャンルがある
53
位置(ロケーション)ゲーム
• GPSや携帯電話基地局から得られる「プレイヤーの位置情報」を利用したゲーム
• プレイヤーの現在位置から都道府県を特定したり、前回からの移動距離などでポイントを付与したり、現実との関連が強いゲーム性をもつ
• 「まちつく!」「コロニーな生活」「Ingress」など
54
私が関わった今回のセッションに関連のあるプロダクト
• ロケナゲ(iOS) :位置情報(GPS/WiFi)
– プレイヤーの現在位置を利用する、いわゆるロケーションゲーム
– 前回のゲームプレイの場所と現在のプレイ場所の距離をポイントとして付
与し、そのポイントを使ってゲームを進行させる
• 北斎今昔(iOS/Android) :位置情報、ジャイロ
– ロケーションベースAR
– 今日の講演内容を実際に運用したもの
– スタンプラリー要素もある
• 京都三条近代建築マップ(iOS/Android) :位置情報とコンパス
– 目標地点をいわゆる「レーダー」で確認して近くまで到着するとその場所
の説明を聴くことができる。
55
今後のセンサーを使ったゲーム
• いろいろ問題点を考えるときりがないのですが、その分未発達、未開拓のジャンルと言えるのではないか
• 未開拓の部分を切り拓いていき、センサーコントロールがゲームの新たな方向を示し、新しい遊びを作り上げていくのではないかと期待しています。
56
本日はありがとうございました。