SlideShare a Scribd company logo
1 of 56
スマートフォンのセンサーを
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
本日はありがとうございました。

More Related Content

Similar to Kansai cedec 2015_okude

タッチ操作の挙動分析による行動・感情認識
タッチ操作の挙動分析による行動・感情認識タッチ操作の挙動分析による行動・感情認識
タッチ操作の挙動分析による行動・感情認識Yutaka Arakawa
 
Arduino用3gシールドの開発と教育への実践(天良先生)
Arduino用3gシールドの開発と教育への実践(天良先生)Arduino用3gシールドの開発と教育への実践(天良先生)
Arduino用3gシールドの開発と教育への実践(天良先生)Takayori Takamoto
 
EKJAPAN IoT workshop
EKJAPAN IoT workshopEKJAPAN IoT workshop
EKJAPAN IoT workshopelekit
 
コードを書かずにIoT, IoT without-coding
コードを書かずにIoT, IoT without-codingコードを書かずにIoT, IoT without-coding
コードを書かずにIoT, IoT without-codingHirokazu Tokuno
 
ビジュアライゼーションの役割とUI開発のイノベーション(2)
ビジュアライゼーションの役割とUI開発のイノベーション(2)ビジュアライゼーションの役割とUI開発のイノベーション(2)
ビジュアライゼーションの役割とUI開発のイノベーション(2)BizCOLLEGE
 

Similar to Kansai cedec 2015_okude (6)

タッチ操作の挙動分析による行動・感情認識
タッチ操作の挙動分析による行動・感情認識タッチ操作の挙動分析による行動・感情認識
タッチ操作の挙動分析による行動・感情認識
 
Arduino用3gシールドの開発と教育への実践(天良先生)
Arduino用3gシールドの開発と教育への実践(天良先生)Arduino用3gシールドの開発と教育への実践(天良先生)
Arduino用3gシールドの開発と教育への実践(天良先生)
 
EKJAPAN IoT workshop
EKJAPAN IoT workshopEKJAPAN IoT workshop
EKJAPAN IoT workshop
 
20140922 ble bootcamp
20140922 ble bootcamp20140922 ble bootcamp
20140922 ble bootcamp
 
コードを書かずにIoT, IoT without-coding
コードを書かずにIoT, IoT without-codingコードを書かずにIoT, IoT without-coding
コードを書かずにIoT, IoT without-coding
 
ビジュアライゼーションの役割とUI開発のイノベーション(2)
ビジュアライゼーションの役割とUI開発のイノベーション(2)ビジュアライゼーションの役割とUI開発のイノベーション(2)
ビジュアライゼーションの役割とUI開発のイノベーション(2)
 

Kansai cedec 2015_okude