自作HoloLensアプリで文字を入力する

こんにちは、mtwandこと00a3afです。あさぎです。

最近は日差しが強くなってきて、熱中症対策と共に、HoloLensのオーバーヒート問題なんかも気になってきました。 結露を避けつつ本体の温度を下げるのは結構気を使いますね。特にHoloLensはどうにも熱伝導率の低そうな素材が中心のガジェットなので、つい過激な方法で冷やしたくなりますが、「つい頭にきて…」では済まされなさそうなので慎重にやりましょう。いや、マジで。

さて、それはそうと前回書いた

mtholoblog.hatenablog.com

こちらの記事の続きです。

今回は

自作HoloLensアプリで文字を入力する

話をします。

uGUIは使えない

まず、uGUIは使えません。 いや、ボタンとかは使えた気がします。試してないけど…。

とりあえず、InputFieldなどは普通には使えません。 UnityEditor上だと普通に使えるのですが、HoloLensに持っていくと、タップしてもアクティブになりませんし、キーボードが立ち上がることもありません

(キーボードを呼び出す方法はあるようです)

littlewing.hatenablog.com

ただし、uGUI自体が全く動かないわけではなく、uGUIを配置して表示させることなどは普通にできますので、これはこれで利用していきます。

キーボードが出ないなら作ればいいじゃない

2vr.jp

これこれ、これですよ。

詳しくは記事を読んでもらうとして、発想だけ パク 参考にします。 特に今回はIPアドレスを前提としたものだったので、フルキーボードを読んでしまうと役不足になりますし。

今回作ったのはこういうものです

f:id:mtwand:20170729164609p:plain

0-9, ., Del, Enter ボタンをUnityのCubeから作成し、配置。それぞれに自作のKeyManagerをアタッチします。

KeyManager

KeyManagerは今回のために作成したスクリプトです。

BaseKeyManagerというスクリプトを基底クラスとして持ち、 Any KeyManagerのように命名されます。

これを三種類、今回は CharKeyManager , DelKeyManager , EnterKeyManager を作成しました。

BaseKeyManagerは MonoBehaviour を継承するクラスで、 private void OnSelect()virtual void Clicked() を持ちます。 OnSelect()GazeGestureManager で AirTap 時に呼ばれる関数で、これが呼ばれたとき、この関数は Clicked を呼び出します。

ClickedはBaseKeyManager上では動きが定義されていません。継承先であるCharKeyManager, DelKeyManager, EnterKeyManager でそれぞれ規定されます。

今回は transform.parent.gameObject.SendMessageUpwards("OnClickChar", character); のように書きました。

これでこのボタンを内包するGameObjectでボタンのクリックが検知できるようになります。

Windowを作る

今回は、多少汎用的に作りたいという思いもあり、Windowオブジェクトと、それを管理するWindowManagerを作りました。

ただこれは個人的にまだ改良したい部分があるので詳しくは解説いたしません。

さしあたっては、先程作成したキーを内包するオブジェクトと、そこにアタッチされた private void OnClickChar(string character) などのイベントを処理する関数を持つスクリプトが存在するとお考え下さい。

そして OnClickChar などの関数はそれぞれ後ほど作成するInputField上の文字列を操作する

text = GameObject.Find("InputField").GetComponent<inputField>().text + character;
GameObject.Find("InputField").GetComponent<inputField>().text = text;

のような処理をします。(Del, Enterなどのボタンも同様にそれぞれの処理を作ります)

InputFieldを配置

入力した文字を表示・保持するためのInputFieldを配置します(試してませんが3DTextでも問題はないはずです)。

先ほど作ったWindowの配下にCanvasを、さらにその下にInputFieldを作成します。

Canvasは設定を変え、WorldSpace上、Windowの中に配置されるようにしてください。HeadLockedはMR的ではないという話もありますし。

f:id:mtwand:20170729171032p:plain

↑こんな感じに

あと、uGUI使うときいつも困るのですが、デフォルトの設定どうにかならないんですかね。輪郭ぼけてるし、文字デカイし。 ってことで、これも調整します。

f:id:mtwand:20170729171230p:plain

はい。なんかだいたいこういう感じにしていつも使ってます。正しいのかどうか、私にもわかりません。どなたか最適解があれば教えてください。

起動

さて、こうしてInputFieldまで設置したら、あとはもうほとんどやることはありません。 今まで作ったObjectを正しく配置して、アプリを起動すればといりあえず、IPアドレスを入力できるダイアログが完成です。

あとはこれをPrefabやらなにやら好きなように加工して自作アプリに埋め込んでください。

KeyBoardの配置を考える必要はありますが、やろうと思えばフルキーボードも自作できると思います。アセットもあるしおすすめはしませんが…。

個人的にはこれを少し改造してGoogleGodanキーボードでも作ってみようかなと思っています。変換までやる気はないですが、かな文字だけでも打てたら少しはホロラビリティ(造語)が上がりそうですね。

詳しくは近々UnityのプロジェクトをGithubにでも上げられたらと思うので、記事を読んでもわからないという方、すぐ使いたいという方はそちらをお待ちいただくか、素直にアセット買った方が良いでしょう。

というか、AirTapを必要としない文字入力の手段が欲しいですね、音声以外で。

Sharingの接続先を入力できるようにする

どうも、mtwandこと00a3afです。

本日はSharingアプリケーションを作成する際に、Serverアドレスを実行側で設定する方法について書きます。

完成図はこちらです

ちなみに先駆者、と言いますか、既に同じことをされている方がいらっしゃるのでご紹介しておきます。

HoloLens/チュートリアル240の接続先をアプリ内で変更できるAdd-onを作った。

私はシーンの切り替えなどは恥ずかしながら経験がなく、本項においても同様の手法は使いませんのでご了承ください。

先に結論

基本的な処理の流れは以下のようになります

  1. Sharing関連の処理を全てDisableにする
  2. 接続先を入力し、その情報を SharingStage に渡す
  3. Sharing関連の処理を起動する

難しいことはないですね

Sharing関連の処理をDisableにする

具体的には SharingStage, SharingSessionTracker, CustomNessages, AutoJoinSession, ImportExportAnchorManager などです。

私はそのほかにもAppStateManatger, SpatialMapping, SurfaceMeshesToPlanes, そのほかSpectator View関係の処理をDisableにしています。

これらの処理はSharingStageを中心とするSharing関係の処理に大きく関連しているので、IPアドレスを指定しないまま勝手に動き出すと大変です。

なお、これらの処理ですが、SharingStageOnAwake で走り出す設計になっているので、(対処療法的ではありますが)アタッチされたオブジェクトごとあらかじめDeActiveしておくとよいでしょう。

接続先を入力し、その情報を SharingStage に渡す

今回はTextInputDialogなるものを自作し、その情報を同じく自作した管理クラスに渡し、SharingStageからその情報を参照しました。

ただし、SharingStageスクリプトはHolotoolkitにて提供されているスクリプトで、これを改変するのはあまり推奨されません。

先述のGameObjectごとDeActive化、というのもそもそも乱暴な方法ではありますし、Singleton化されている処理でもあるので、何か普通にもっとうまくやれる気がするので誰か良い方法教えてください。

Sharing関連の処理を起動する

今回はすべてDeActive化されているだけなのでこれを SetActive(true) すればOKです。

最後に

今回の一通りの処理はここ HololensAppBase/HololensSharingWithConfirmApplicationBase.unitypackage at master · M-T-Asagi/HololensAppBase · GitHub にまとまってるので、ご入用の方はどうぞ。 ただ、自分でもわかるほど作りが雑なのと、HoloToolKitが古かったり手加えてあったりと、恐らく普通には使いまわせないと思うので適当に切り出してご利用ください。

また、ダイアログ関連の処理については追って記事を書きます。正直こっちが本命な気もする。

自分のプロジェクトでSpectator Viewをやる方法。

こんにちは、mtwandこと00a3afです。 最近HoloLens Meetup Vol.4に参加してSpectator Viewについてお話ししました。 緊張とか不安とか色々あったけど、とりあえずいうこと言えてよかった。

さて、そのSpectator Viewですが、前回に引き続き、今回はご自身のプロジェクトでSpectator Viewを動かす方法を書きます。 ぶっちゃけ事前準備(前回の記事)ができていたら難しいことは何もないです。

また、MicrosoftさんのAdding Spectator View Support to Your Unity App、そして前回も紹介いたしましたが、中村 薫@かおるん さんの記事を参考に実行しましたので、手順についてはこちらをご参考いただいた方が良いと思います。

機材を用意する

ないとできません。 最低限

  • 開発PC
  • HoloLens
  • カメラ
  • 諸々のコード類

がないとできません。

Calibrationを実行。

Calibrationプロジェクトを自分の環境に合わせ手直しし、実行します。 実行が完了すると User/Documents にキャリビュレーションデータが出力されるので、こちらを確保しておきます。 ちなみにですが、Calibration実行後に再度Calibrationを実行すると、画像データはバックアップされるのですが、 CalibrationData.txtは消されるので、うまくいったデータがあれば忘れる前に別の場所にコピーしておいた方が良いです。

Spectator Viewの実行に必要なデータをコピーする

  • 最新のHoloToolKitをインポート
  • ここ からHolographic Camera Rigをコピーし自分のプロジェクトに貼り付ける

スクリプトの手直し(直ってました)

本項の内容は最新版のスクリプトを使っている場合は無視してください。最新版ではすでに修正されている内容です

  • RemoteSpatialMappingSource.cs を修正
    • 53行目付近を SurfaceObject surface = CreateSurface(mesh, ”RemoteSpatialMapping”, transform); AddSurfaceObject(surface); のように修正

Prefabなどを配置

  • 先ほどインポートした Addons/HolographicCameraRig の中に SpectatorViewManager.prefab というPrefabがあるのでシーンに配置
  • SpectatorViewManagerのSpectator View IP(カメラに接続されるHoloLensのIPアドレス), Sharing Service IP(HoloLensなどが接続しに行くSharingService.exeが実行されているマシンのIPアドレス)を入力、Anchor(ImportExportManagerなどがアタッチされているオブジェクト), Sharingオブジェクトを指定(シーン上に配置されているアンカー、Sharingオブジェクトをドラッグアンドドロップでアタッチ)。
  • SV_***.cs , SceneManager.csをAnchorに, RemoteSpatialMappingをCustomSpatialMappingに配置(CustomSpatialMappingという名前にする必要があるかどうか、未検証です)

CopyDLL.cmd を実行

https://github.com/Microsoft/HoloLensCompanionKit/blob/master/SpectatorView/CopyDLL.cmd を実行 この時これを普通にダブルクリックしてもダメなので、 HoloLensCompanionKit/blob/master/SpectatorViewShift+右クリックコマンドウィンドウをここで開く を実行するか、管理者権限でコマンドプロンプト、もしくはPowerShellを起動し、 HoloLensCompanionKit/blob/master/SpectatorView まで移動。 CopyDLL.cmd /path/to/your/project/Assets のように、プロジェクトのAssetsフォルダをオプションに指定し実行。

動かす

  1. まず、プロジェクトをビルドし、HoloLensに配置
  2. SharingService.exe を実行
  3. HoloLens上でプロジェクトを実行
  4. Unity Editorを実行
  5. Unity Editor側のSpectator ViewメニューからCompositorを起動
  6. Compositor Window上にカメラの映像が表示されることを確認
  7. Spatial Mappingボタンを押す
  8. 接続が成功していればSpatial Mappingが実行される
  9. Spectator Viewを楽しむ
  10. うまくいかない場合は両側プログラムを停止し、2からやり直し

トラブルシューティング

ここ らへんも参考にしてもらいつつ

  • HoloLens, Cameraの動作状態を確認する
  • キャプチャボードの動作・出力解像度などを確認する
  • 各種ケーブルの接続状態を確認する
  • Sharingの実行状態を確認する
  • Calibrationの結果を見直す
    • ここ らへんを参考にしつつ、値が正常か確認

大切なこと

あきらめない気持ち

最後に

弊社ではSpectator Viewの実験、試走などのお手伝いを受け入れています。 Spectator Viewをしたいが設備・道具がない、HoloLensが複数台ない、などの方は @asagi_00a3af までご連絡ください。 プログラムの実装など含め、ご相談をお受けします。 (あんまり大規模なものや、公序良俗に反する内容・団体からの依頼など、場合によってはお受けきれない場合がありますので、ご了承ください。最初はあくまで相談ということで、宜しくお願い致します)

Spectator Viewやった

この前仕事でHoloLensのSpectator Viewやりました。 今更か……という感じもしますが、調べてみると結構やってみた系の記事なかった気がするので、自分のハマりポイント書くついでにつらつら書いていこうと思います。

参考元

SpectatorViewの公式リポジトリ github.com

中村 薫@かおるん さんの記事。Spectator Viewの基本的な部分を全編日本語で書いてくださっている。必見。 www.naturalsoftware.jp

ANDREASJAKL.COM の記事。キャリビュレーションがうまくいかなかったときに参考にした。 www.andreasjakl.com

使えるキャプチャボードが実質限られている

これはハマりポイントというかSpectator View試すのが遅くなった理由なんですが、今日現在

github.com

Software

ということで、BlackMagicとElgato製のキャプチャボード以外使えません。 多分自分でSDK引っ張ってきて手持ちのキャプチャボード使えるようにプログラム書けばいけると思うのですが、そのあたり全く触ったことないうえ、たまたま会社に合ったキャプチャーボードのSDKがこれまた使いづらく、全然自分でやれる気配がなかったのであきらめました。

Blackmagic Intensity Shuttle USB 3.0の相性問題

正確に言えば相性問題ではなく、PCに搭載されているUSB3.0ボードの信号帯域の問題らしいのですが、要は家電量販店で買ってきたPCそのままでは動かない可能性が高い、ということらしいです。 弊社のPCは運良くというか、必要な信号帯域の確保がされていたらしく、セットアップしたら普通に使えました。 もしかしたら最新のPC(USBポート全部3.0になってるようなやつ。弊社PCはこれでした)なら問題なく使えるのかもしれません。

相性問題…?

BlackMagic使っていて、個人的に最大の問題だったのはBlackMagicの相性問題そのものではなく、BlackMagicが問題をしっかり克服して使えているのか偶然起動しただけなのかがわかってないせいで、後々キャリビュレーションなどの工程に入ったときそれが設定のミスなのか、プログラムのバグなのか、BlackMagicの相性問題なのか分からなかったところです。

具体的にはCalibration.slnをビルドして実行したとき、ウィンドウにパステルブルーっぽい画面が表示されるばっかりで、どうもキャリビュレーションが始まらない。 これは結局下記ぺー時で参照できるような

www.andreasjakl.com

BlackmagicのOutputの解像度とプログラム上で受け取ろうとしている解像度が一致しないことによる問題だった(私の環境では両方と1080p30に合わせることで成功している)のですが、前述のとおりBlackmagicの相性問題を疑ってしまい全然作業が進まなくなりました。

Blackmagicには専用のキャプチャアプリがあるのでこちらで動作を先に確認しておきましょう。 こちらで一度映ったのが確認できれば相性問題の心配はほぼいらないと思います。

そして何より、機械の声(Debugログ)をちゃんと聞こう。

キャリビュレーションAppは動いているが、HoloLens側の写真が排出されない

いざいろいろと難関を乗り越えキャリビュレーションAppが動いても、HoloLensサイドの画像(xx_holo.jpg)が排出されないことがあるかもしれません。 これはおそらく

  • HoloLensのデバイスポータルが無効になっている
  • バイスポータルのログインID・PASSが間違っている
  • HoloLensがスリープ状態、もしくは電源が切れている。

上記三点を確認すれば直ると思います。 一応キャリビュレーションは最初からやり直した方が良いです。

キャリビュレーションが終わらない?

キャリビュレーションAppは自動で終了したり、終了時に自動でCalibrationData.txtを生成したりはしません。 ある程度写真が取れて(10-20枚程度?)そろそろ良いだろうというときにはキャリビュレーションAppのウィンドウをアクティブにして、自分でEnterキーを押すことで処理を完結させる必要があります。 そうすろと30-60秒程したした後にCalibrationData.txtが生成されるので、あとは普通にプログラムを終了してOK

HoloLensの映像、切り替わりませんが…。

これは私の勘違い話なのですが、Spectator ViewはHoloLensのカメラを接続したカメラの映像で置き換えるというようなものではありません。 ので、DevicePortalなどから見るMixed Reality Captureはいつも通りのHoloLensのカメラを通してみた世界の映像になっています。 中村薫さんが紹介されいるようにサンプルプロジェクトをUnityで起動するとUnityEditorを通してSpectatorViewの世界を楽しめる(録画や撮影も可)ので、現在はそちらから、ということらしいです。

最後、これから

ここまでで私の躓きポイントを紹介しましたが、これがこれからSpectator Viewを始めようという皆さんの助けになれば幸いです。

個人的な今後最大の課題は実際に客前や出張でSpectator Viewを使うときサーバーになるPCはどうしようかな、とかそういうところですが、ほかにも現実映像とVirtual映像の合成処理を担当しているのはPCなのかHoloLensなのかとか、もし処理自体はPCでやっているのだとしたらMSの最初のプレゼンの時に見たような解像度高めのバーチャル映像をMixedにできるのかなとか、いろいろ考えています。

何より、SpectatorViewをうまく使ったアプリケーションの開発が一番大事ですね。

HoloLens開発ブログします

個人的な開発ブログです

主に仕事で開発した内容で差し支えなさそうなものをぽちぽち書いていこうと思っていますが、あくまで個人としてのブログです。 ここに書かれた内容は常に私個人の意見・主張であり、所属する団体・会社等とは一切かかわりありません。

方針

基本的にはUnityやHoloLensに関する個人的な開発・研究記録になります。 誰かの役に立てばとは思いますが、あくまで自分の未来のためになればという心づもりです。

とはいえ、一般に公開している以上その内容について一切責任を負わないということはできないとも思うので、いくつか方針としてのルールを定めておきます

  • 内容について間違いなどが発覚した場合などは、できる限りそれを明記したうえで訂正するものとします。
    • あまりに細かいミスの場合(タイプミスやコードに関わらない誤字脱字など)修正内容を明記しない場合もある。
  • 内容について正当な権利を持つ方から記事の削除・修正の依頼があった場合、それに従うものとする
    • その時、削除・修正の依頼の有無は相手の要望による非公表にする場合もあるものとする。

とりあえずはこんなところで、追記があれば + (追加されたルール) xxxx/xx/xx 追加 という形で追加していきたいと思います。