サイトをお引越ししました
ここに引っ越しました(*´・ω・)
【Unity】MirageSoloアプリ開発 2019edition - コントローラー入力
OverView
GVR SDK 2019年版におけるコントローラーのクリックイベント受取り
Environment
Windows10 64bit
Unity2018.2.14f1
Google VR SDK - GVR SDK for Unity v1.190.1 (2019-01-16)
Lenovo Mirage Solo - Android 8.0.0
Method
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ControllerInput : MonoBehaviour { private static readonly GvrControllerHand[] AllHands = { GvrControllerHand.Right, GvrControllerHand.Left, }; void Update () { foreach (var hand in AllHands) { GvrControllerInputDevice device = GvrControllerInput.GetDevice(hand); if (device.GetButtonDown(GvrControllerButton.TouchPadTouch)) { Debug.Log("touch"); //(1)がタッチされたとき } if (device.GetButtonDown(GvrControllerButton.TouchPadButton)) { Debug.Log("button"); //(1)が押されたとき } if (device.GetButtonDown(GvrControllerButton.App)) { Debug.Log("app"); //(2)が押されたとき } } } }
コントローラーの画像は Daydream View のハードウェア - Daydream ヘルプ から拝借した.
【Unity】MirageSoloアプリ開発をはじめる2019edition - 6dof対応とコントローラー表示
Overview
最近のGoogle VR SDKを用いてMirageSoloのアプリ開発を行うやりかたとかです.
現在はなにもないところからコントローラーの表示と6dofに対応させる部分まで書いてあります.
Environment
Windows10 64bit
Unity2018.2.14f1
Google VR SDK - GVR SDK for Unity v1.190.1 (2019-01-16)
Lenovo Mirage Solo - Android 8.0.0
Method
0. 環境構築
UnityでAndroidアプリ開発を行えるレベルの環境構築は行っておく.
1. Google VR SDKのインポート
Google VR SDK - GVR SDK for UnityをGitHubのReleaseからDLしてきてインポートします.
配布はunitypackageで行われてます.
https://github.com/googlevr/gvr-unity-sdk/releases
2. 新規シーンを開く
新規シーンを開き,初めからあるMainCameraとDirectionalLightを削除する.
3. SDKからPrefabのインスタンスを作る
・GvrEventSystem (Assets/GoogleVR/Prefabs/EventSystem/GvrEventSystem.prefab)
・GvrHeadet (Assets/GoogleVR/Prefabs/Headset/GvrHeadset.prefab)
・GvrControllerMain (Assets/GoogleVR/Prefabs/Controller/GvrControllerMain.prefab)
4. Create EmptyGameObject and MainCamera
Playerという名の空のゲームオブジェクトを作成し,中にMainCameraを作成する.
MainCameraにはGvrPointerPhysicsRaycasterコンポーネントを追加する.
GvrPointerGraphicRaycasterではないので注意.
MainCameraコンポーネントのClipping PlanesのNearの値を0.01に設定する.これをしないと近いものが描画されない,つまりコントローラーが見えん.
また適当にPlayerオブジェクトのtransform.position.yを1.6などに設定する.身長分(m).
5. 各GameObject内にPrefabのインスタンスを作る
MainCameraの子に GvrReticlePointer (Assets/GoogleVR/Prefabs/Cardboad/GvrReticlePointer.prefab)
を作成する.これを使うとレティクル(見ている方向の中央点)が表示されるが,必要ない場合は無効化,または追加しなくて良い.
Playerオブジェクトの子には
GvrControllerPointer (Assets/GoogleVR/Prefabs/Controller/GvrControllerPointer.prefab)
のインスタンスを作る.
最終的にこの時点ではこうなる.
この時点で6dofに対応し,コントローラーの表示ができているはず.
【YOLOv3】オリジナルの学習済みモデルを作成する
OverView
画像から手の位置を認識をさせたかったんじゃぁ.
お.いい高速な画像認識アルゴリズムがある.つかってみるか...
ということで,YOLOv3で自分で作成したデータを学習させる方法
つまりオリジナルの学習済みモデルの作り方を書き残します.
YOLOはYou Only Look Onceの略,物体検出アルゴリズム.
darknetはC/CUDAで開発されたOSSニューラルネットフレームワーク
Environment
macOS Mojave version.10.14.3
Python 3.7.2
Method
1. darknetをmake & Install
https://github.com/pjreddie/darknet からdarknetをcloneする
git clone https://github.com/pjreddie/darknet cd darknet make
makeをする前にMakefileを編集することでdarknetでGPUを使うか否かなどの設定ができる.
# Compiling with CUDA GPU=1 # Compiling with OpenCV OPENCV=1
2. 学習用データセットを作る
この記事を執筆しているとき,自分は人の手を認識させたかったので,データセットの中の名前がhandなんとかになったりしていますが,適宜ファイル名を分かりやすいものに変えても問題はない.
backupフォルダ
学習済みモデルが完成したときに格納されるディレクトリ
datasets
学習用画像と学習用画像のどこに何が写っているかを記述したtxtファイルが入っている.
画像とtxtの名前は揃っていないといけない.
hand-obj.names
hand
今回は手しか認識させないので1行目にhandとだけ記述.
複数のものを学習させたいときには2行目3行目と認識させたいものの名前を記述していく.
hand-test.txt
datasets/img_0-0.jpg datasets/img_0-1.jpg datasets/img_0-2.jpg
学習用画像のある場所を列挙する.こちらはテスト用の画像リスト.
hand-train.txt
datasets/img_0-0.jpg datasets/img_0-1.jpg datasets/img_0-2.jpg
こちらも学習用画像のある場所を列挙する.こちらは訓練用の画像リスト.
hand.data
classes= 1 train = hand-train.txt valid = hand-test.txt names = hand-obj.names backup = ~/Documents/GitHub/darknet/cfg/task/backup
hand.dataにはここまでに作成したtxtファイルなどの場所などを記述.
最後の行のbackupは学習済みモデルを保存するディレクトリ指定だが,権限的にちゃんと保存できる場所にしておかないと,時間かけて学習したデータが保存されない.何時間も時間を掛けて学習させエラーが最後の最後に起きたら悲しぃ(経験済み)
yolov3-hand.cfg
darknet/cfg/yolov3-voc.cfgをコピーして名前を変更した.
このファイルには学習時のハイパーパラメータが記述されている.
細かいことをしないのであれば,とりあえず以下の行数の「filters」と「classes」の値だけ変更すればいい.
605: filters=18 611: classes=1 689: filters=18 695: classes=1 773: filters=18 779: classes=1
この値にはルールがあり,classesは認識させたいオブジェクトの数.今回は手(hand)だけなので1.
filtersは「(classes + 5) * 3」の値となる.今回は(1+5) * 3 = 18とした.
ex. 学習用データセットを自作するのに今回使ったツール「labelImg」
https://github.com/tzutalin/labelImg
とりあえず,labelImgを使わせてもらった.
Install方法は以下のReadme
https://github.com/tzutalin/labelImg/blob/master/README.rst
直感的に動かすことができるが,画像の範囲を選択したあとにxmlで出力するのではなく,txtで出力するように設定を変更する.たしかYOLO用に書き出し.みたいな設定があった.
3. YOLOv3用の学習モデル初期値ファイルをDL
https://pjreddie.com/media/files/darknet53.conv.74
からDLできる.適当なディレクトリに保存しておく.155MB.
今回は darknet/models/に保存した.
4. 学習開始
コマンドを叩いて学習スタート.
./darknet detector train hand.data yolov3-hand.cfg models/darknet53.conv.74
5. 学習したモデルを使ってみる
Ref.
https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/
https://www.slideshare.net/BusHato/ss-100355414
https://orizuru.io/blog/machine-learning/yolov3/
【Unity】Color型変数をもとにDebug.Logの文字色を変更する
Pref.
Unity上のDebug.LogのテキストカラーをColor型変数から指定する方法
Env.
Unity2018.2.14f1(恐らくどのバージョンでも良い)
Method
Color _logTextColor = new Color(1, 1, 1); String _text = "test"; Debug.Log (string.Format("<color=#{0:X2}{1:X2}{2:X2}>{3}</color>", (byte)(_logTextColor.r * 255f), (byte)(_logTextColor.g * 255f), (byte)(_logTextColor.b * 255f), _text));
UnityAsset「External Mobile Controller」をリリースしました
Pref.
LAN内のスタンドアロンVRをスマホアプリから操作可能にするアセット 「External Mobile Controller」をリリースしました.
Unity Asset Store : https://assetstore.unity.com/packages/tools/gui/external-mobile-controller-136516
今回の記事はこのアセットで何ができるのか? このアセットを使うには? といった部分を書いていきます.
Env.
Unity2018.1.14f1 - macOS mojave
External Mobile Controllerって何ができるのか
External Mobile Controller(EMC)を導入することで
Unityで制作したスタンドアローンVR(Oculus Goなど)向けアプリを スマホからリモートで「メソッド呼び出し」「映像確認」が可能になります.
これのアセットを組み込んでスタンドアローンVR向けアプリを制作することによって 展示会でお客さんに見てもらうときに 「今なに見えていますか?」 「ちょっと調整するので一旦Oculus Go返してもらってもよろしいですか?」 といったやり取りをしなくて良くなります.
また,実のところスタンドアローンVRで動作することを想定して開発したアセットではありますが,
・スマホからPC用にビルドしたアプリを操作,Game画面の確認
・スマホからスマホ用にビルドしたアプリを操作.Game画面の確認
のようにEMCを導入したアプリであればVR用アプリ以外でも LAN内のスマホからの操作が可能になります(有用性があるのかは知りませんがw)
分かりにくいですが,UnityEditor上で実行されているものが 手前のiPhoneからシーンの切り替えと画面確認が出来ています.
また展示会の利用以外では 常駐体験ブースのオペレーティング用アセットとしても利用が可能なので そういったシステムを開発されている方も使えるかと思います!
導入方法
導入は簡単です!
1.Unity Asset Storeから「External Mobile Controller」をUnityプロジェクトに導入
インポートを行い,シーン設定をちょこちょこっと行い,遠隔で操作されるときの表示名やパスワードを設定します.
2.手持ちのスマホにリモートコントロール用アプリ「Unity EMC」をインストール
からアプリをインストールしてください.
3.LAN内でEMCを導入したプロジェクト(アプリ)の起動とスマホにインストールしたアプリ「Unity EMC」の起動
Unityアセットが導入されて適切に設定されたプロジェクトがLAN内に存在する場合, スマホにインストールされたコントロール用アプリからリモートコントロールが可能になります.
Unityで制作したアプリをリモートコントロールする手順は以上ですが, より丁寧なアセットの導入方法はアセットのunitypackageの中にpdfで同梱してあります.
おわりに
今回リリースしたアセットでは
・コントロールされる側をアセットでの提供
・コントロールする側のアプリをiOSとAndroidでリリース(審査)
と大掛かりになり,想像よりも大変でした(笑 今年はOculus Quest,Holo Lens 2といった新たなデバイスの誕生も控えているので このアセットに各展示会のデモなどの回転がよくなると嬉しいです(๑•̀ㅂ•́)و
Google Play および Google Play ロゴは、Google LLC の商標です。