はじめに

HoloLensが生み出すMRの新しい世界はワクワクするものですが、逆に新しすぎて何をやっていいかわからない、そんなありふれた迷える子羊代表として今回は調査・研究も兼ねてHoloLensの活用法を考えてみました。

現実世界には知らないこと、よくわからないことがいっぱいです。でもそんな悩みの答えも大抵はWikipedia先生が知っています。
普段は文明の利器・スマホを取り出せばWikipediaにアクセスできますが、人々が当たり前のようにAR・MRグラスを装着しだした未来の世界ではより直接的に知らない知識にアクセスできるようになっているかもしれません。
「これなんだろう?」とジェスチャしたらその物事に関連する情報が目の前の空間上に投影される世界。ちょっといいなって思います。

今回はそんな未来をちょっとだけ先取りしたHoloLensアプリを開発してみたいと思います。

つくりたいもの

HoloLensのカメラに映した物体に纏わるWikipediaの記事を空間上に表示するアプリ

環境・ツール・サービス

  • 初代 HoloLens
  • Visual Studio 2019
  • Unity 2019.4
  • MRTK 2.5.3
  • Azure Cognitive Services / Computer Vision

セットアップ

セットアップに必要な作業についての説明は以下の公式サイトにお任せします。
基本的に書かれている通りに問題なく進めることができました。

実装

ありがたいことに公式サイトにComputer Visionを活用した物体認識のチュートリアルが用意されていたので、こちらを踏襲させて頂きました。


このチュートリアルを完了すると、HoloLens空間上でエアタップを行うことでComputer Visionから物体認識の結果をJSONで取得することができるようになります。

今回はここで取得したJSONを元にWikipediaのAPIからデータを取得し、HoloLens空間上にWikipediaの概要を表示できるようにしてみたいと思います。

Computer Visionから取得したタグ情報を元にWikipediaの概要を取得し、ラベルのテキストに挿入する

次の GetWiki() メソッドでWikipediaの記事情報の取得を行います。
上手く行けば取得した概要情報がHoloLens空間上のラベルに表示されてくるはずです。

    IEnumerator GetWiki(string articleTitle)
    {
        var url = $"https://ja.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles={articleTitle}";
        using (var unityWebRequest = UnityWebRequest.Get(url))
        {
            yield return unityWebRequest.SendWebRequest();

            var jsonResponse = unityWebRequest.downloadHandler.text;
            var wiki = JsonConvert.DeserializeObject<WikiRoot>(jsonResponse);
            var wikiPages = wiki.query.pages.Values.Where(wikiPage => !string.IsNullOrEmpty(wikiPage.extract));

            foreach (var wikiPage in wikiPages)
            {
                lastLabelPlacedText.text += $"{wikiPage.title}\n{wikiPage.extract}\n\n";
            }
        }
    }

WikipediaのAPIが返すJSONのフォーマットに合わせる形でデシリアライズ用のクラスも用意します。

    [Serializable]
    public class WikiRoot
    {
        public string batchcomplete;
        public WikiQuery query;
    }

    [Serializable]
    public class WikiQuery
    {
        public Dictionary<string, WikiPage> pages;
    }

    [Serializable]
    public class WikiPage
    {
        public int pageid;
        public int ns;
        public string title;
        public string extract;
    }

上記のコードではUnity公式の JsonUtility ではなく Newtonsoft Json.NET を使ってJSONのデシリアライズを行っています。 というのも、 JsonUtility はDictionaryをデシリアライズするために ISerializationCallbackReceiver自前で実装しないといけません
試してみたのですが今回は上手くいかなかったので、定番の Newtonsoft Json.NET を使わせて頂くことにしました。
公式サイトからzipファイルをDLし、 \Bin\netstandard2.0Newtonsoft.Json.dll をUnityプロジェクトに導入することで無事動作しました。
(環境によってはこちらの手順link.xml をプロジェクトに追加する必要があるかもしれません)

結果は…

おお!表示できました!
少し見づらいですが、iPhoneをComputer Visionが認識し、関連するワードのWikipediaがHoloLensの空間上に表示できています。

さらに調子に乗って別の物体も認識させてみました。

こちらはよりはっきりと文章が見えるのではないでしょうか?
ノートを認識させてみましたが、「テキスト」や「本」など近い単語のWikipediaが表示できています。

ペンの認識もこの通り!

HoloLens実機での映像は画像よりもさらに未来感があり、個人的には割と満足感が得られる結果となりました。
次は更に発展させてUIをもう少しどうにかしてみたいですね。

ここまでお読み頂きありがとうございました。
この記事で少しでもHoloLensの世界に興味を持っていただけたら一開発者としても嬉しい限りです。

Happy MR hacking!