2020年2月13日木曜日

EyeTrackingTargetを試してみた【MRTKv2.2 】

お疲れ様です。ZuQ9->Nnです。
これは、2020/02/08(土)から2020/02/09(日)に開催されたOsaka HoloLens "2" ハッカソン2020の準備のため

EyeTrackingネタをやろうと決めたときに調べた調査メモのようなものです。

EyeTrackingはずっと実機じゃないと使えないと思っていたのですが、
Unity上でもシミレーションできると知って試してみました。

今回の環境はUnity2019.
Microsoft Mixed Reality Toolkit v2.2.0 です。

Microsoft.MixedReality.Toolkit.Unity.Foundation.2.2.0.unitypackageのインポート
UnityのMixed Relaity ToolkitメニューからAdd to Scene and Configureを選択する等はいつも通り
わからない方は、以前の記事を参考にしてください。
EyeTrackingを利用するにはProfileの設定が必要です。

Hierarchyから、MixedRealityToolkitを選択し、Inpsectorを表示
InpsectorからCopy & Cutomizeをクリック

Cloning Profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTextMixedRealityToolkitConfigurationProfileとしました。

InpsectorのProfileがTextMixedRealityToolkitConfigurationProfileに切り替わっていることを確認し
Profileの中からInputを選択 DefaultMixedRealityInputSystemProfileの横のCloneボタンをクリック

Cloning Profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTestMixedRealityToolkitInputSystemProfileとしました。

InpsectorのProfileがTestMixedRealityToolkitInputSystemProfileに切り替わっていることを確認し
Input Data Providersの + Add Data Providerをクリック、New Data providerが追加されますので
▼マークをクリックして展開します。

New Data providerのTypeのドロップダウンから
Microsoft.MixedReality.Toolkit.WindowsMixedReality.Input > WindowsMixedRealityEyeGazeDataProviderを選択

Input Data Providersから Input Simulation Serveiceの▼マークをクリックして展開 DefultMixeRealityInputSimulationProfileのCloneボタンをクリック

Cloning profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTestMixedRealityToolkitInputSimulationProfileとしました。

InpsectorのProfileがTextMixedRealityToolkitInputSystemProfileに切り替わっていることを確認し
Simulate Eye PositionのチェックをOnにします。


最後に、Hierarchyから、MixedRealityPlayspaceの下のMain Cameraを選択
InpsectorからUse Eye TrackingのチェックをOnにします。

これで、EyeTrackingのためのProfileの設定は完了です。
今回はEyeTrackingを利用して、視界に入ったらCubeの色を変えるようなサンプルを作成します。

HierarchyからCreate > 3D Object > CubeでCubeを作成

Cubeの座標を適当にCameraに写る位置に移動させます。(このサンプルでは x:0 y:0 z:2)

Hierarchyから、Cubeを選択、InpsectorからAdd Component > New Scriptを選択して新しいScriptを追加します。

Script名は特に何でも良いのですが、今回はEyeTrackingTestとしました。

 EyeTrackingTestの中身はこんな感じです。 Hierarchyから、Cubeを選択、InpsectorからAdd Component > EyeTrackingTargetを選択してアタッチメント
InpsectorからEyeTrackingTargetのイベントを設定します。
EyeTrackingTargetのイベントと、そのイベントの後、どのような動きになるかを関連づけます。
Hierarchyから、Cubeを選択、InpsectorのEyeTrackingTarget、On Look At Startに Runtime OnlyにはCube、Functionには、EyeTrackingTestのAfterOnLookStartを設定

InpsectorのEyeTrackingTarget、On Look Awayに Runtime OnlyにはCube、Functionには、EyeTrackingTestのAfterOnLookAwayを設定

これでアプリは完成です。Unityで実行するとこんな感じです。
Unity上はHead Trackingと同じ扱いになります。
なので、実機に入れないと実際の動きは確認しきれません

EyeTrackingTarget.csについて
こちらは、MixedRealityToolkit-Unityで提供されているScriptです。

Class EyeTrackingTarget

A game object with the "EyeTrackingTarget" script attached reacts to being looked at independent of other available inputs. Assembly: cs.temp.dll.dll Syntax public class EyeTrackingTarget : InputSystemGlobalHandlerListener, IMixedRealityPointerHandler, IMixedRealitySpeechHandler, IMixedRealityBaseInputHandler, IEventSystemHandler EyeCursorSnapToTargetCenter If true, the eye cursor (if enabled) will snap to the center of this object.
文字どうり、EyeTrackingの対象となるオブジェクトにアタッチして利用します。
定義されているイベントに、そのイベントの後の処理を関連づけることで、制御を行っていきます。
イベントは下記

* OnDwell
Event is triggered when the target has been looked at for a given predefined duration (dwellTimeInSec).
ユーザーがdwellTimeInSecで指定された一定時間ターゲットを見ていた場合。
 InpsectorからdwellTimeInSecが指定できるので、その秒数で指定された時間内でターゲットを見ていた時のようですが、 ちょっとよくわかりませんでした。

 * OnLookAtStart
 Event is triggered when the user starts to look at the target.
 ユーザーがターゲットに視線が入った時

* WhileLookingAtTarget
 Event is triggered when the user continues to look at the target.
ユーザーがターゲットを見続けたとき

*OnLookAway Event to be triggered when the user is looking away from the target.
ユーザーがターゲットから目をそらしたとき

* OnSelected
Event is triggered when the looked at target is selected
ターゲットが選択されたとき
これは、EyeTrackingで見つめて、かつ ハンドトラッキングのタップ、またはVoice Commandで対象のオブジェクトが選択された場合です。

目からビームでは、OnLookAtStartのタイミングで当たり判定を行いました。
そのため、必ずしもビームが当たらなくても視界に敵のターゲットが入った時点で
敵がダメージをくらい、うまい人だと、かなり長く遊べてしまいます。

WhileLookingAtTargetで3秒以上見つめたら、みたいな制御は必要だったかもしれません。

このようにEyeTrackingTarget.csを利用することで、
対象のオブジェクトに対する処理を書くだけでいいのは楽ですね。

しかし、きっちりとした制御を行うのは、
なにかしらもっと複雑な処理が必要になるかと思いますが
今のところ、僕の知識ではわかっていません。

EyeTrackingにつては他のデバイス含めて、
機会あるごとに積極的に使っていこうかと思っています。
何故かはわかりませんが、ハンドトラッキングよりも可能性が広がる気がしています

2020年2月12日水曜日

Osaka HoloLens "2" ハッカソン2020に参加 【二日目2020/02/09(日)】

お疲れ様です。ZuQ9->Nnです。
2020/02/08(土)から2020/02/09(日)に開催された
 Osaka HoloLens "2" ハッカソン2020 の二日目2020/02/09(日)レポです。

2020/02/08(土)で、なんとか目からビームのアプリを
実機で動くことに目途をつけて大阪の実家に戻り休むことにしました。

夜通しの開発も提供されてたのですが、一人作業になってしまうこと
日曜のハッカソンを乗り越えても、次の月曜からの仕事を考えると
ここは、無理に作業をせず、いかに休んで体力と集中力を保つかを重視しました。

会場に入って、とりあえず、実機での確認を行いました。
また、最終的な動画を撮れないことも考えて
バグがあっても動いているところさえと思い
保険的に、提出用の動画撮影も行いました。

棒状のオブジェクトから、LineRenderをメインに利用したアセットに切り替えたため
当たり判定がうまく行っていなかったり、音とパーティクルの素材 Prefabでは
Play on awakeのチェックが入りぱなしになっていたりと凡ミスも多く
動いてはいるものの。。不具合も結構ありました。

一番の苦戦は、やはり当たり判定です。当初はビームと一緒に
Shpereの球も出して、その当たり判定で倒せる実装にしたのですが
逆に球が全然当たらず、敵が倒せないようになってしまっていました。

しかし、一人作業の疲れからか、集中力がかなり落ち始めて
ずっと座っているのも。辛くなってきました。
頻繁に離籍しては休みを入れ、休憩を繰り返しました。

その間は、もう自分の焦りの気持ちとの闘い、
これは、最悪、バグ入りの動画を見せればいいとの保険の
ための動画をとっていたので、そちらを何回も見直すことで、
気持ちを落ち着けたり、先にプレゼンの資料だけを書いておいたり
その場で出来ることの作業を、少しづつ進めていきました。

エナジードリンクの差し入れもいただき
ようやく不具合も落ち着いたところで、お昼休憩
お昼はお弁当が用意されました。
また、ここで、HoloLens 2の実機の利用制限が出されました。
HoloLens 2は、一日目の利用により、バッテリーがかなり少なくなっていました。
あらかじめ予約することで、30分間利用できるルールになったので
予約をおこない、そこまでは、ひたすらにUnityでの確認を繰り返しました。

ここまで、不具合の修正と、動く最低限を目指しての
消極的対応だったので、せめてFirst Person Shotter系でよくみる、
十字の照準(CROSSFIREと言うみたいですw)等をつけてみて
実機での確認を待つばかり。。

ようやく実機での確認可能になってインストールをしてみたものの
ここで、先ほどいれた十字の照準(CROSSFIRE)が実機では
シェーダーがこわれてピンク色になり、またもや戻す羽目に。.. orz..

不具合の修正をおこない最終動画の撮影と、実機確認を行いました。
やはり、アイトラッキングの制御がカクカクだったのと
当たり判定が簡単になりすぎて、うまい人だと、
今度は、逆にゲームが終わらない感じに仕上がってしまいましたが
残念ながら、これ以上、手を加えるより、このままで評価をしてもらおうと
またもや、消極的な対応に戻しました。

1日目に行っていた、じゃんけんと、くじ引きの結果、
トップで発表することが決まっていたので、プレゼン資料のしあげと
配布用のパッケージ作成に時間を費やすことにしました。

15時に開発終了、その後、スポンサーのセッションが行われ
いよいよ最終発表。。最終発表の資料はこんな感じでした。
もう、なるべくポジティブなメッセージ性を発信しようと内容を何度か書き換えました。


途中でPCの操作を間違えてしまって焦ったり、
もはや自分では何を言っているのか頭が真っ白な感じでした。
発表終了して、次の人が来たので、慌ててしまい
審査員の人の総評の途中で舞台から捌けようとしたりと
もはや、何やってんだよって感じのテンパり具合。

発表前に、公平を期すために、この2日間での進捗で。。
とか言われて。アレやべ。事前に、プロトタイプ作ってきちゃったよ
ってのがやたらと気になり、 他の人の発表に心ここに在らずみたいな状態に

一応、全員の審査が終わってから、スタッフの方には
ごめんなさい、事前にある程度つくりました。てへぺろ☆(・ω<)って
正直に打ち明けました。あんまり、これは審査員は気にしてなかったみたいです。

発表のあと、試遊時間に、一人作業なので、自分のアプリの
アテンドを行うことに、となりのチームと合同でHoloLens 2を利用したこともあり
イマイチ、アプローチをうまくできず、試遊時間を活かしきれませんでした。

 試遊での課題は、やはりキャリブレーションでした。
また、自分のアプリをピン止めして直ぐに使えるようにすべきでした
どこにあるかをまず見つけてもらうのに苦労しました。

審査員によっては、簡単すぎたり、逆にキャリブレーションがうまくいかず
遊べなかったりとアイトラッキング故の問題点が多かった印象です。
最後に、Unityの@takashijona(常名)さんには、かなり楽しんでもらえたのでなんだか、ホッとしました。

他の開発者の作品で、個人的に気になっていた、音の可視化のアプリのみ体感させてもらいました。
実は、自分のネタを捨てて他人のネタをやるなら、これだなぁと思っていたアプリだったので。。

試遊を終え、審査結果発表。優勝のMVPは、AEDの訓練アプリ
ですよね。。僕が審査員なら絶対に選ぶよ。。って結果に。

その他各賞の発表が。。そしてなんと、主催コミュニティの一つHoloMagiciansさんから
賞をいただける、結果に、事前のプロトタイプ作成が気にかかりましたが
場の雰囲気を壊したくなかったので、素直にいただくことに。。
なんでも、EyeTrackingは絶対に役に立たないと思っていたが
そこを何とかしようとアプローチしたこと。
アプリとして完成して一応、一通り遊べるようになっていたことが評価されたようです。

賞をとれるとは思ってもみなかったので、かなり意外だったし
申し訳ない、こんなネタで。。とか、
嬉しさやら恐縮の気持ち、その他諸々が入り混じりました。

最後に、参加者スタッフで記念撮影、会場の片づけを行いました。
片づけの時間、他のチームの開発者さんから、刺激になりましたと言われたのが、なんとも印象的でした。

開発者だとやはり、EyeTrackingは利用してみたい欲求は高いみたいでした。
しかし、それを何に活かすか?って提案は中々できない、
ましてや真面目なビジネスシーンでは。。

だからこそ、こんなネタが許されるハッカソンのイベントで
目からビームというネタ一本で積極的に使えるように割り切ったのは
あながち悪い結果ばかりでは無かったようです。。

東京で次の日、普通に仕事があったので、新幹線の時間が
間に合わないとつらいなと思い、早々に会場を出てしまいました。。

これほど、大規模で、かなり大きな企業がスポンサーになっているイベントを
開催してくれたスタッフさんには感謝しかありません。中には、夜通しのイベントにも付き合ってた人もいたような感じなので本当にご苦労様でした。

なんどか、ハッカソンのイベントには参加したことがありますが
賞がもらえたこともあり、過去最高のハッカソンだったと思います。

ただ、100%全力で楽しめたか?と言われると、
色々な反省点や課題も多く残りました。。

また、これを次に活かせるのかとか思うとちょっと尻込みもあります。
まぁ、そこは、そんなにも思い詰めず、緩くしていこうかなと。。

とりあえず、主に発作的な欲求で参加したハッカソン。
今年はこれくらいのフットワークの軽さが維持できて
他のイベントにも積極的になれればと考えています。

おまけ。。
ハッカソンの後、気になってアイトラッキング関連を調べなおしたら。。
こちらのMicrosoftの公式ドキュメント

"お客様の目からレーザービームを撮影してください。 RoboRaid For HoloLens 2で試してみてください。"

との記述が。。。
どうやらすでにMicrosoftの公式アプリが、同じネタを実装していたようです。。
プレゼンでは、ひょっとして世界初では。。とかいっちゃったけど。。

全然、世界初でもなんでもなかったw

2020年2月10日月曜日

Osaka HoloLens "2" ハッカソン2020に参加 【一日目2020/02/08(土)】

お疲れ様です。ZuQ9->Nnです。

 2020/02/08(土)から2020/02/09(日)
Osaka HoloLens "2" ハッカソン2020 が開催されたので参加してきました。

Osaka HoloLens "2" ハッカソン2020 (2020/02/08 10:00〜)

スタッフ確保等兼ね合いで、少しだけ一般枠を増枠しました。 抽選が終了していますが、繰り上がりの可能性、(スタッフ増員等による)枠の増加/変動の可能性がありますので、 参加を希望する方は引き続き参加表明をお願いいたします。 また、逆に今後繰り上がり等で参加になった際に、参加が難しくなったという方はキャンセルの手続きをお願いいたします。 一般枠の定員が募集開始4時間ほどで埋まりましたが、抽選制&スタッフ人数次第では増枠(または他の枠との人数調整)の可能性有りなので、気にせずご応募ください。 当日はHoloLensやHoloLens 2等の開発が可能なイベントです。 メンターの対応などを考慮し、イベントでは以下の環境で進める予定です。 事前環境構築済みで参加していただくとよりスムーズに開発に入っていただけます。 Mac端末で参加予定の方への注意事項BootCampなどでWindows 10 OS環境をセットアップ済みの開発機を持参してください。 Bootcampで構築したWindows OSはUnity,Visual Studioをインストールするため最低でも100GB近いサイズは必要になります。ハッカソン当日開発に使う場合は常用できるディスクサイズを確保したものを用意してください 2020/01/20 HoloLensの開発環境に必要なセットアップ作業と確認方法を記載した資料を公開 2/1の環境構築ハンズオンはこの手順に従ってセットアップを実施します。 Mixed Reality Toolkit V2開発環境構築(2020/01版) Windows 10 Fall Creators Update(以降) OSのエディションについてはHome以上であれば問題ありません。 Unity 2019.1.10f1 以下のコンポーネントをセットアップ UWP Build Support(IL2CPP) UWP Build Support(.NET) Microsoft Visual Studio 2019(Community Edition可) Visual Studioインストール時に「ユニバーサルWindowsプラットフォーム開発」「Unityによるゲーム開発」選択 以下のオプション系もインストール Windows 10 SDK 10.0.17763 ⇒
きっかけは、2020/01/17(金)にHoloLens 2 HackDay2020 in Tokyo に参加したことです。
ここでアプリを作成し、やはり、楽しかったし、また、課題も見えてきました。

次にチャンスがあったら、もう少し上手く作業できるのでは?
あるいは、もっと面白いアプリを作れるんじゃないのか?
また、一人だと限界が早くなるけど、ほかの人と連携すると限界を少し伸ばせるのでは?
と、さまざまな、思いがこみ上げ、勢いで参加を決めました。
大阪には実家があるので、泊りのイベントでも、まぁ何とかなるだろう。そんな気持ちもありました。

いつまでも、他人がやったピザのネタに乗っかるのが、なんとなく嫌だったので
今回は、両手でピザのアプリは完全に封印しました。

HoloLens 2 HackDay2020 in Tokyo では、EyeTrackingをきちんと試せなかったので
絶対にEyeTrackingのネタで行こう。。そして、EyeTrackingを使うなら、目からビームのネタで行こう。
そう思い、事前にEyeTrackingに関して調査を行っていました。

以前、北海道に行ったとき、当日の移動でやらかしてしまったので
前日の2020/02/09(金)に、仕事終わりの直後に、新幹線で大阪に移動、実家で過ごすことにしました。

ハッカソン一日目、当日、茶屋町にあるMBSの会場に入りました。
あまりの会場の大きさと、まさしくテレビで見るような、いかにも
発表する舞台のある会場で、思っていた以上に、ガチな印象を持ちました。
参加人数は、参加者、スタッフを含めて50人くらいだったかと思います。

最初、Slackに入れなかったりトラブルも多少あったものの、
自己紹介を終えて、アイデアのある人の1分間ピッチが行われました。
ここで、せっかくなので目からビームのネタを披露しました。

まぁ、誰か一人くらいは、乗っかってくれるのでは?
そんな淡い期待があったものの、結局、誰一人として共感は得られませんでした。 orz...
ちょっと迷ったのですが、どうしても自分のアイデアを捨てれられなかった事
また、ほかに一人でやる方もおられたので、ボッチソンの道を選択しました。

Wi-Fiも提供され、いざというときの調査ができるようになり
とりあえず、お昼ご飯をとることにしました。
メンバーがいないため、結局お昼ご飯もボッチですることになってしまいましたw

昼から、@Miyaura さんによる、開発講座を聞いていると
EyeTrackingを使うには、目のキャリブレーションが必須という衝撃の事実が。。

なるほど、どうりで以前の Hack Dayではうまく動かなかったのか。。
という思いと、同時に、これは試遊の時のハードルが上がってしまうと感じました。
しかし、今更、後に戻ることもできず、突き進むことに。。

開発を 17時の中間発表まで、もくもくと開発、僕は事前にちょっと
プロトタイプを作ってきてたので、とりあえず実機でのEyeTrackingが
どのような体感になるかを確認、同時に、中間発表の動画を撮影しました。

ここで、勘違いが発覚します。てっきり両目の情報を扱えると思い込んでいましたが
実際に利用しているAPIでは両目から何かオブジェクトを操作する用ではありませんでした。

軽くその場で調べてみたのですが、すぐには見つけられませんでした。
なので、両目からビームを出すのは早々にあきらめることにしました。

最初は、棒状のオブジェクトをアイトラッキングで操作する予定でしたが、
そもそも勘違いをベースにコーディングしていたので
制御がヘンテコで、アイトラッキングでは操作が、ほとんどできなくて
あまりにも爽快感が得られず、なんか思っていたのと違う。。って結果に。

中間発表のプレゼン資料の作成も必要となり、
ここで、ボッチ開発の作業量の多さと、辛さを痛感させられることに
中間発表のプレゼンを書くことで、問題点を洗い出し一度頭を整理することに集中しました。

提供されたお菓子も堪能しながら、

プレゼン資料作成に飽きたら、少し開発作業をしたりと
とりあえず、何かしら手を止めない状況にしました。
そして、出来上がった中間発表の資料はこちら。

そして中間発表。。この時、審査員から、何故、HoloLens、HoloLens 2を
使う必要があるのか。。ってことも考えて。。との指示が。。
その場の思い付きで、なんか、「手や言葉の不自由な人にも出来る」。。
とか、言ってしまい、最後の締まで言葉が思いつかず、
おもいっきりグダグダな感じになってしまいました。

中間発表を元に、アプリの改修を始めたのですが、
いったん、目からビームをTrail Rendererにして出してみても
かえって邪魔になってしまったり、ロックオンのようなUIの作成が
思った以上に難しく、容易には実装出来きず苦戦してしまいました。

そして、決定的なのは、NavMeshでの制御を基本に考えていたので
ステージそのものをstaticにしてしまったこと。。
これによって変更すると、すぐにNavMeshが破綻して
今まで動いていた内容がすべてダメになってしまう結果となってしまいました。

流石に、ここで、何も動かないのはマズイと思いgitからもとに戻して
アイトラッキングの制御周りのコードの見直しと
きれいなビームのアセットに置き換えて、見栄えをよくする等
なるべく壊さずに、最終審査で実機で動くことを最低限にして
消極的な対応を行うことに切り替えました。

当初は考えていなかったBGMや効果音、爆破のパーティクル等
急遽、無料のアセットから選出して、なんとか実機で動く目途をつけて
1日目を終了しました。