kansai cedec 2015_okude

56
スマートフォンのセンサーを Unityでつかう

Upload: seiki-okude

Post on 18-Jul-2015

615 views

Category:

Presentations & Public Speaking


2 download

TRANSCRIPT

Page 1: Kansai cedec 2015_okude

スマートフォンのセンサーをUnityでつかう

Page 2: Kansai cedec 2015_okude

2

講師自己紹介奥出成希(Seiki Okude)

• フリーランスのプログラマー• 専門学校の講師

2

Page 3: Kansai cedec 2015_okude

3

この世の中はセンサーであふれている

• 自動ドア• 湯沸かしポット• テレビのリモコン• 防犯センサーライト• エアコンの温度調整

Page 4: Kansai cedec 2015_okude

4

スマートフォンのセンサーは多彩

• 3軸加速センサー、ジャイロスコープ• GPS、デジタルコンパス、気圧• カメラ、マイク、近接センサー• タッチパネル、物理ボタンなどなど

Page 5: Kansai cedec 2015_okude

5

デバイスの中と外をつなぐもの

外の状況を読み取りデバイス内に伝えることで、その状況に応じた処理を行うことが出来る

Page 6: Kansai cedec 2015_okude

6

なにか使って、作ってみよう

今回の例• バーチャルスノードーム• ヘッドマウントディスプレイの中身+立体視• ロケーションベースAR

Page 7: Kansai cedec 2015_okude

7

バーチャルスノードーム• スマートフォンの中でスノードームを再現する

• デバイスの傾きで中の雪が動く

• 球状のガラス表現は難しそうなので作らない

• 固定オブジェクトも置きたい

Page 8: Kansai cedec 2015_okude

8

これを作ったきっかけ● Unityでスマートフォンのアプリを作るという講義のネタだった

● 授業の中で重力を弱めたいという質問が出た● 設定項目は図の部分● Gravityの項目はVector3だった● yの値をプラスにしたら上に「落ちる」、xに設定したら横に「落ちる」、とうぜんzに設定したら前後に「落ちる」わけですね

● 重力を操作するゲームとか面白いかな

● デバイスを傾けても重力の方向が現実と一致してたら面白いな

Page 9: Kansai cedec 2015_okude

9

使うセンサーは3軸加速センサー

• Wiiリモコンのセンサー• その名の通り、加速を検知• だいたいのスマートフォンには搭載されている• デバイスの加速(移動)を三次元ベクトルで得る• 静止状態で重力の方向を検知• 重力無視したければハイパスフィルタで除去

Page 10: Kansai cedec 2015_okude

10

設計

• Boxコライダのみを持つオブジェクトを床天井壁にする

• 重力の影響を受けるオブジェクトを雪に見立てる

• 重力の影響を受けないオブジェクトも配置する• 三軸加速センサーからの値をUnityの物理エンジンの重力の方向に設定する

Page 11: Kansai cedec 2015_okude

11

プロジェクトの配置ドームの作成• 空のGameObjectにBoxコライダーを追加しそれを板状に変形

• それを6つコピーして中空のキューブ状に配置する

雪の作成• キューブを雪の粒に見立てて小さめに作る

• Rigidbodyを仕込んで、Mass小さめにしておく

• Use Gravityチェックして重力で落下するように

• ドーム内にたくさんコピーしておく

Page 12: Kansai cedec 2015_okude

12

スクリプトvoid Update () {

Physics.gravity =

new Vector3(

Input.acceleration.x,

Input.acceleration.y,

Input.acceleration.z * -1

);

}

Page 13: Kansai cedec 2015_okude

13

実演

Page 14: Kansai cedec 2015_okude

14

固定オブジェクトを置きます• Unityちゃんパッケージimportして配置します

• アニメさせません• Boxコライダをこのポーズに仕込みます

• キラキラはこのコライダに当たります

Page 15: Kansai cedec 2015_okude

15

実演

Page 16: Kansai cedec 2015_okude

16

これだけじゃつまらないのでさらに追加

• 背景にカメラ画像をはめ込む• 忘れがちですが、カメラも立派なセンサー

Page 17: Kansai cedec 2015_okude

17

WebCamTexture

• カメラの映像をテクスチャとして使える• 使い方は超簡単• WebCamTextureのインスタンス作って、それをマテリアルのMainTextureに割り当てて、Play()を呼ぶだけ

Page 18: Kansai cedec 2015_okude

18

プロジェクトの配置• 通常のオブジェクトたちとは違うレイヤーに配置する(webcamという名前にしておく)

• 平行投影カメラを設置• webcamレイヤーのみを映すように設定• 通常のカメラはdepthを-1に、webcamのカメラは-2に設定(つまり向こう側に置く)

• 通常カメラはClearFlagsをDepthOnlyに、webCamはSolidColorで黒塗りつぶし

• Quadオブジェクトを横縦比4:3の大きさで置く

• このオブジェクトがwebcamのスクリーンになる

• ちょうど画面に収まるように画角調整• Unlit/Textureのテクスチャ無しでmaterialを作成、割り当て

• 光源の影響を受けないようにしたい

Page 19: Kansai cedec 2015_okude

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");

}

}

Page 20: Kansai cedec 2015_okude

20

実演

Page 21: Kansai cedec 2015_okude

21

仕掛け部分だけをGitHubで配布しています。あとは自分で実装してみてください。

https://github.com/sokude/VirtualSnowdome

Page 22: Kansai cedec 2015_okude

22

ヘッドマウントディスプレイの中身+立体視

• ある場所でOculusRiftをかぶってみた• とても感銘を受けたが買って開発は今すぐは無理

• でも立体視でぐるぐる周囲を見てみたい

Page 23: Kansai cedec 2015_okude

23

じゃあ裸眼立体視でつくってしまえ

Page 24: Kansai cedec 2015_okude

24

一晩で作りました

と言いたいところですが二晩かかりました

Page 25: Kansai cedec 2015_okude

25

設計

• 裸眼立体視はカメラを2つ配置して左右少しだけ位置をずらす

• その2つのカメラのスクリーンをビューポート設定で左右に配置

• 2つのカメラの親になるカメラルートオブジェクトを設定

• ジャイロの値とこのカメラルートの向きを連動させる

Page 26: Kansai cedec 2015_okude

26

立体視とは

• 左右の目でそれぞれ少し位置のずれた画像を見せることにより、奥行き感を脳に錯覚させる

• OculusRiftのようにヘッドセットで強制的に分ける• Nintendo3DSのような視差バリア• ステレオグラム画像のように自力でがんばるなど

★今回は自力でがんばってみましょう

Page 27: Kansai cedec 2015_okude

27

まずは裸眼立体視を実現しておこう• 背景などを配置

• アセットストアから墓場の背景セットをimportして使わせていただく

xiaolianhuastudio / Make Your Fantasy Game - Lite

Page 28: Kansai cedec 2015_okude

28

まずは裸眼立体視を実現しておこう

2台のカメラは左右に座標が少しずれているビューポート設定で左右に画面分割

図のように左右にカメラを2台配置(真ん中は画面外塗りつぶし用)

Page 29: Kansai cedec 2015_okude

29

ゲームビューはこんなふうになります

裸眼立体視はできました

Page 30: Kansai cedec 2015_okude

30

ジャイロスコープとは

• WiiリモコンプラスとかSixAxisとか• デバイスの姿勢を検出• UnityではQuaternionで取得できる

Page 31: Kansai cedec 2015_okude

31

ジャイロスコープを使う● GameObjectをジャイロか

らのデータを処理する入れ物とする

● gyroScriptがCameraPrefab

の方向を制御する

● ジャイロスコープから現在の端末の回転角を取得して、カメラオブジェクトの向きにほぼそのまま放り込む

Page 32: Kansai cedec 2015_okude

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;

}

}

Page 33: Kansai cedec 2015_okude

33

実演

Page 34: Kansai cedec 2015_okude

34

ちょっと追加要素

• せっかくなのでUnityちゃんにもう一度登場していただきましょう。

• VirtualSnowdomeと同様にパッケージをimportする

• カメラからさほど離れていない場所に配置• 今度はアニメーションをさせておく

Page 35: Kansai cedec 2015_okude

35

実演

Page 36: Kansai cedec 2015_okude

36

妄想全開、Unityちゃんと墓場デート

これもかんたんでした。

Page 37: Kansai cedec 2015_okude

37

仕掛け部分だけをGitHubで配布しています。あとは自分で実装してみてください。

https://github.com/sokude/stereogram

Page 38: Kansai cedec 2015_okude

38

今後の課題

• 裸眼立体視はそれなりに人間的に疲れる• ゲーム内の空間を移動する術がない• 画面にタッチすることすらおぼつかない

→素直にヘッドマウントディスプレイ→Bluetoothコントローラで操作

Page 39: Kansai cedec 2015_okude

39

この技術が向いているもの

GPSやカメラと組み合わせてみる→ロケーションベースAR的な展開

(ただし立体視とは相性悪そう)

屋内測位システムと組み合わせてみる→アミューズメント施設のアトラクション的なもの

Page 40: Kansai cedec 2015_okude

40

GPSを使ったロケーションベースAR

• AR(拡張現実)– 現実環境をコンピュータにより拡張する技術

• ロケーション情報– GPSやWiFi、携帯電話基地局情報などから地球上の現在位置を取得する

• ロケーション情報とARを組み合わせる– ARとして現実環境に付け加える情報を位置情報から生成する

Page 41: Kansai cedec 2015_okude

41

概要

• 緯度経度で指定した場所に3Dモデルを置く• 端末のGPSから取得した現在位置の緯度経度と照らし合わせる

• あたかもその3Dモデルが現実に存在しているかのようにカメラ画像と合成して表示する

※立体視は行わない

Page 42: Kansai cedec 2015_okude

42

使用するセンサー

• カメラ• ジャイロスコープ• GPS

• 地磁気センサー(デジタルコンパス)

Page 43: Kansai cedec 2015_okude

43

設計• GPSで得られる緯度経度の情報をゲーム空間上のX座標Y座標に見立て、

カメラオブジェクトの位置を決定する。

• 同様に3Dモデルもその平面上に緯度経度を模した値で配置する。

• 最遠景には背面カメラからの映像をリアルタイムで表示しておく。

• ジャイロスコープとデジタルコンパスにより、カメラオブジェクトの

回転(視線方向)を制御する。

• こうすることによってユーザー現実世界での移動とゲーム内カメラが

連動し、ゲーム内の仮想空間と現実の空間をつなぐことができる。

Page 44: Kansai cedec 2015_okude

44

問題点地球は球体なのでゲームの仮想空間の地上とマッピングした時に誤差が出る。広いエリアでは問題になるがこの誤差が許される範囲での運用を前提にしている。

Page 45: Kansai cedec 2015_okude

45

プロジェクト配置● 「バーチャルスノードーム」と同じようにWebCamTextureを使い最遠景にカメラ画像。

● 「ヘッドマウントディスプレイの中身」と同じようにジャイロスコープで動くゲーム内カメラオブジェクト(ただしカメラは1つ)

● 表示物:なにか3Dモデルとか、看板とか

Page 46: Kansai cedec 2015_okude

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;

// 表示オブジェクトの位置も相対座標にする

Page 47: Kansai cedec 2015_okude

47

コンパス使ってない?• ジャイロのY軸回転と合わせて端末の向いている方角を取得するために使うはずだった。

• ところが、Unity/AndroidではジャイロのY軸回転の0位置がコンパスの北に一致していた。

• 全部の端末でそうなるのかは検証しきれないが、少なくともNexus4と7では問題なかった。実際にこの仕組みでアプリをリリースしたが不具合は報告されていない。

• 内部的にコンパスは使われているかもしれないがUnityのプロジェクトからは意識しなくてもいい。

Page 48: Kansai cedec 2015_okude

48

コンパス使ってない?• Unity/iOSではジャイロのY軸回転はジャイロをenableにした

時の向きを起点にしているようで、コンパスの北と一致しなかった。

• この場合はジャイロをenableにするのと同時にコンパスの値を取得してY軸回転の値に足す。

Page 49: Kansai cedec 2015_okude

49

実演

Page 50: Kansai cedec 2015_okude

50

まとめ

本日3点の実装例を紹介したわけですが…

Page 51: Kansai cedec 2015_okude

51

据え置きゲーム機とセンサーコントローラー以外の入力デバイスのゲームはイマイチ流行らない• キネクトやPlaystationMoveは微妙だった• 例外:Wiiリモコン、WiiFit

• Wiiはあれが売りで全面に押し出した• WiiFitは体感モノとしてゲームとは違う分類にすべき• なぜかWii以外の場合、遊んでいるのを見られるのがちょっと恥ずかしい(あくまで私の印象)

• 緻密な入力を要求するゲームはいわゆるコントローラー以外のデバイスでは無理がある

Page 52: Kansai cedec 2015_okude

52

モバイルゲーム機とセンサー3DSのジャイロを使ったゲーム• 視差バリア方式の立体視とモーションコントロールの相性は最悪• New3DSで劇的に改善

AndroidやiPhoneではどうか?• ソーシャルゲームなんかではモーションコントロールがゲームの中核となり得ることはなさそう– ガッツリ遊んでいる人ならまだしも空き時間とか移動中に本体振り回して遊ぶか?

• GPSは例外的に「位置ゲーム」と呼ばれるジャンルがある

Page 53: Kansai cedec 2015_okude

53

位置(ロケーション)ゲーム

• GPSや携帯電話基地局から得られる「プレイヤーの位置情報」を利用したゲーム

• プレイヤーの現在位置から都道府県を特定したり、前回からの移動距離などでポイントを付与したり、現実との関連が強いゲーム性をもつ

• 「まちつく!」「コロニーな生活」「Ingress」など

Page 54: Kansai cedec 2015_okude

54

私が関わった今回のセッションに関連のあるプロダクト

• ロケナゲ(iOS) :位置情報(GPS/WiFi)

– プレイヤーの現在位置を利用する、いわゆるロケーションゲーム

– 前回のゲームプレイの場所と現在のプレイ場所の距離をポイントとして付

与し、そのポイントを使ってゲームを進行させる

• 北斎今昔(iOS/Android) :位置情報、ジャイロ

– ロケーションベースAR

– 今日の講演内容を実際に運用したもの

– スタンプラリー要素もある

• 京都三条近代建築マップ(iOS/Android) :位置情報とコンパス

– 目標地点をいわゆる「レーダー」で確認して近くまで到着するとその場所

の説明を聴くことができる。

Page 55: Kansai cedec 2015_okude

55

今後のセンサーを使ったゲーム

• いろいろ問題点を考えるときりがないのですが、その分未発達、未開拓のジャンルと言えるのではないか

• 未開拓の部分を切り拓いていき、センサーコントロールがゲームの新たな方向を示し、新しい遊びを作り上げていくのではないかと期待しています。

Page 56: Kansai cedec 2015_okude

56

本日はありがとうございました。