見出し画像

TOKYO NODE XR HACKATHONで作ったものとか得られた知見とか

このハッカソンは虎ノ門ヒルズでのVPSを簡単に実装可能なToranomonSDKを用いて、何かしらのXRコンテンツを作成するものでした。

最終選考に残ったチームはなんかすごいところで発表できるのですが、残念ながら私のチームは最終選考に残れませんでした😭

とはいえハッカソンで得られた知見は結構あるので、頭の整理も兼ねて書いていこうかなと思います。

作ったもの

私はチーム「パチコマ」として参加していました。
チームではこういうのを作りました。

残念ながら最終選考には残れませんでしたが、せっかくなのでここで発表しようと思います。

当初はテロリストを倒そうぜって話で進めてましたが、もっと単純化した方がわかりやすいかなと考えゾンビサバイバルになりました。

最終的に虎ノ門ヒルズでスマホをかざすとゾンビが湧いてきて、それを倒しながら生き残ることを目的としたXRアプリを作成しました。

今回はリアリティを出すために以下のような銃デバイスも用意しました。

このデバイス作るの大変だったんですよー
電子部品をアキバまで買いに行ったり、ボタンを引き金あたりにつけるためにやすりで削りまくったり
Bluetooth連携はUnityにないのでSwiftで連携用のコード書いたり(ぶっちゃけハッカソンでここが一番コストかかった)

この銃デバイスの上部(銃を構えて覗くところらへん)にスマホをマウントして体験できます。
(もちろんマウントしなくても体験可能)

アプリと銃デバイスはBluetoothで接続され、銃デバイスの引き金を引くとアプリ上でも銃弾が発射されます。

銃デバイスについては拡張すればリロードも対応できそうだなと考えてます。

アプリは大きく二つのモードがあります。
各モードについて解説します。

アサルトモード

銃デバイスとの連携が可能なのはこのモードです。

このモードを起動したスマホで虎ノ門ヒルズの特定の場所を映すとゾンビが出現するので、ユーザはゾンビを撃って倒します。

前述した銃デバイスと連携していれば銃をかざして引き金を引けば発射、連携しない場合はスマホをかざして画面をタップすれば真ん中の照準から弾が発射されます。

ゾンビがユーザに近づくと攻撃してくるので、ユーザは自身のHPが0になるとゲームオーバー

このモードは後述するコマンダーモードのユーザーとリアルタイム同期されるわけですが、その機能はアサルトモードユーザ同士でも有効です。

つまり複数人でアサルトモードのプレイが可能なので、現実世界でL4D的な事ができます。

コマンダーモード

こちらのモードは直接ゾンビとは戦わず、アサルトモードのユーザーを間接的にサポートするモードです。

ToranomonSDKで提供される虎ノ門ヒルズの3Dモデル上にアサルトモードのユーザとゾンビが表示されます。

コマンダーモードのユーザはアサルトモードの状況を俯瞰視点で見ることができます。

ですがただ見るだけでは面白くありません。
そこでコマンダーモードのユーザは3Dモデルの好きな場所にデコイ(囮)を置くことができます。

このデコイを置くとアサルトモードのユーザ視点にも表示されます。

ゾンビは基本的にアサルトモードのユーザを狙って動きますが、デコイが置かれるとそちらを狙って動くようになるため、プレイヤーへの飽和攻撃を防ぐことができます。

今回はデコイとしましたが、一緒に戦ってくれるロボットや、回復アイテムの設置などの要素を組み込むんだり、それらを実行するためにポイント制を儲けたりなどするとコンテンツの幅が広がると考えています。

また、コマンダーモードの大きな特徴として、XRアプリだけど現地に行かなくていいところです。

アサルトモードを利用しているユーザーがいれば、コマンダーモードのユーザーは家でも職場でも電車や車の中でもこのアプリを体験することができます。

これまでのXRアプリ(VPS使う系は特にARアプリ)の場合、コンテンツを提供する特定の場所に行かなければなりませんでしたし、体験するには多くの場合五体満足でなければなりません。

例えば友達と虎ノ門に遊びに行ったけど足を怪我していてアサルトモードを一緒に体験できないというようなケースでも、友達はアサルトモード、自分はカフェに座りながらコマンダーモードでサポートみたいな事もできるわけです。

開発の課題

VPSのトラッキングロスト

アサルトモードではToranomonSDKのVPS機能を使って屋内の自己位置推定をしています。

ただVPSのトラッキングがロストすると座標がクリアされるので、それを維持するためにSDKを少しいじりました。

トラッキングがロストした際に座標がクリアされる処理を止め、ロスト直前の正常にトラッキングされてた座標を保持するようにしました。

ロスト中はスマホの加速度やジャイロセンサーを用いて自己位置を推定します。

再度トラッキングが成功すればその座標を真として再び利用することでこの問題を解決しました。

異なる座標系の同期

コマンダーモードで最も大きな課題は異なる座標系のオブジェクト同士によるリアルタイム同期でした。

リアルタイム同期はPhotonを使ったシンプルなものですが、Photonは対象オブジェクトの座標をそのまま同期するため異なる座標系に行くとズレてしまいます。

例えば、A座標系とB座標系があったとして、A座標系では(1, 1, 1)の座標でもB座標系から見たらオブジェクトのデータ上は(1, 1, 1)でも実質的に(20, 20, 30)相当になったりするわけです。

この課題を解決するためにはどちらかの座標系をもう片方の座標系を合わせる必要があります。

異なる座標系が3系以上の時は、共通の基準点を定めて全ての座標系がそこを参照するという方法があります。

座標系を合わせると言っても基準点が分かればいいので、今回はトラッキング成功時の座標系を基準としました。

ToranomonSDKはよく作り込まれているため、トラッキング成功時のカメラの座標値を計算してくれる処理があります。

その座標値をアサルトモードユーザの座標値に当てはめてあげるとコマンダーモードでも虎ノ門ヒルズの3Dモデル上に表示できるようになりました。

なお、ゾンビの座標値は上記の座標値で単純な置き換えはできないので、コマンダーモードユーザの座標値を基準に相対的な数値で補正しました。

トラッキングロスト時の座標切り替わり

ToranomonSDKではImmersalというVPSサービスのSDKを使っています。

このSDKでは固有の座標系を持っているためVPSでトラッキング完了した段階で座標系が固有の座標系に切り替わるためこのような挙動をしてしまいます。

そのため、コマンダーモードの座標系ではアサルトモードのユーザーとゾンビの座標系がトラッキングの状態によってコロコロ切り替わってしまい、同期されたオブジェクトがあっちゃこっちゃ行ってしまいました。

トラッキング成功時の座標値を入れても、トラッキングがロストしたらまた座標系が変わってしまいどれだけ座標系を合わせてもイタチごっこになります。

そこでVPSのトラッキングロストでも示した手法と同じように、トラッキング成功状態での座標値を常にトレースしておき、トラッキングロスト時には最終の座標値をベースにアプリの機能を維持するようにしました。

ハッカソンで得られた知見や気付き

VPSコンテンツってめんどくせえ

VPSはその特性上、試そうと思うとどうしても現地に行く必要があります。
それは開発でも利用でも同じで、通常のスマホアプリとかと違ってクッッッッッッソめんどくさいと感じました。

開発のめんどくささはまあしょうがないとして、利用のめんどくささはどうにかせんといかんと思いました。

わざわざ特定の場所に行かなければ利用できないアプリなんて体験が終わったらアンインストールするのがオチです。

あとインストールしてもすぐに体験できないのも微妙だなと思いました。
ソシャゲとかってスマホに入れたらすぐに体験できますよね。それに慣れきった人たちがアプリを入れてすぐに体験できないという体験を許容できるかと言われると疑問です。

ということもあり、今回ハッカソンで開発したアプリではコマンダーモードでこの問題を解決しようとしてみた次第です。

一言でいうと、特定の場所にフィジカルとバーチャルの両面同一で集まれる仕組みって感じでしょうか。

XRにおける見栄えの重要性

審査前の提出締切後に他チームの作品を見ていると、キラキラしたりエフェクトとかめっちゃかかっててぱっと見興味をそそられました。

弊チームとしては技術的に色んな検討や実装をしてきたつもりですが、どうしても他チームに比べてファーストインプレッションで劣っているなと感じたのが正直な感想です。

提出後にもっとエフェクトとかも凝っとけばよかった〜と反省しました。

と感情的な感想はさておき、一旦冷静に考えてみるとXRコンテンツでのファーストインプレッションはいわゆるWebアプリやスマホアプリよりも重要性が高いのではないかと思った次第です。

前述したようにXR関連(VPS含む)のサービスって面倒くさいんですよ。
体験するまでに多くのステップを踏む必要があり、スマホに慣れた我々はそれに耐えられない。

だからこそおっと思えるようなファーストインプレッションを提供する必要があるわけです。

スマホをかざすと棒人間が踊るアプリと
スマホをかざすと初音ミクが踊るアプリ、それぞれの画面がファーストインプレッションとして提示されたらどっちをインストールしますかっていうと後者が多いと思います。

もちろんファーストインプレッションが素敵でも中身の見栄えもよくなければ継続利用が望めませんので、全体的に見栄えは無視できないと学びました。

VPSの環境変化によるトラッキング精度低下

今回のハッカソンで提供されたToranomonSDKのトラッキングは結構な頻度でロストします。
これはVPSの仕組み上仕方がないのですが、ハッカソンを通じてそれをどうやったら解決できるかという考える切っ掛けなりました。

VPSの仕組みは、画像から特徴点(物体の角とか縁とか)を計算し、特徴点を組み合わせて特徴マップを作成し、その特徴マップとVPS利用ユーザのカメラから取得した画像の特徴点をマッチングして位置を推定します。

この特徴点は(厳密には特徴点に含まれる特徴量)環境に大きく影響を受けます。時間帯(朝、昼、夜)、天候(晴れ、曇、雨、雪)などなど

要は形状とかは変わっていなくても光の当たり具合で風景は全く異なることになるため、どうしても精度に影響します。

例えば晴れの日の昼間に構築した特徴マップを持ったVPSを雨の日の夜に使用すれば精度は著しく低下するはずです。また、置物が移動したり、ポスターなどが変わったりしても影響が出るでしょう。

こんな感じで一回特徴マップを作ればいいってわけでもないのがVPSのめんどくさいところです。

では影響を受けにくい特徴マップを構築すればいいのではとなります。
これはその通りで、様々な環境に対応可能な柔軟な特徴マップを構築すればこの問題は解決します。

では柔軟な特徴マップはどうやってつくりましょう。
アプローチは大きく二通りあると思います。

1.特徴マップ自体の頑強性を高める
2.複数の特徴マップを用意し、サービス側で制御する

1はまあ画像処理の分野ではるか昔から研究されている分野で、特徴点マッチングとかググれば色々出てきます。まあ最近だとディープラーニングでやっちゃいます系が多いですが、そのためには大量のデータが必要
2はシンプルで、朝、夜、晴れ、雨とバリエーションをもたせた特徴マップを用意し、サービス側で9時から12時は朝の特徴マップとか設定で切り替えればいいだけ。

さて、1と2で共通するのは、2種類以上の特徴マップが必要ということです。
1みたいな大量に集めるのは面倒です。
2も面倒ですよね。一つ作るだけでも面倒なのに

じゃあ1種類だけ特徴マップを作ってサービス化して、ユーザーが体験しているスマホとかのデバイスから取得した画像でさらに新たな特徴マップを生成できるようにすれば、ユーザーが勝手に特徴マップのデータを拡充してくれますよね。

ユーザーが拡充してくれた特徴マップでトラッキングの精度が上がり、さらにユーザーが増え、さらにデータが拡充されと好循環が生まれると考えられます。

何を言いたいかというと、技術だけで頑張ってもサービスとしての継続性を高めるのは難しいけれど、仕組みで工夫すれば低コストで高品質なサービスに仕上げることができて継続性を高められそうですねという話

今後の発展性

今回作ったアプリは、あくまでもゾンビサバイバルをコンテンツジャンルとして採用しましたが、主軸はやはりフィジカルとバーチャルのマルチユーザ連動とだと考えています。

ユーザー管理

XRコンテンツって一過性のものが多く、VPSなどのAR系に至っては一過性どころか揮発性と言っていいくらいだと感じています。

だいたい特定の場所に行って体験したらそれで終わりという感じなので、今回のアプリもそうならないようにユーザーアカウントを作成して、ステータスみたいなのを用意したりして継続性を持たせると伴にエンタメ性も高めて池r場なと思います。

大規模マルチユーザ化

今回のユーザーは少数を想定していますが、せっかくPowerd by PLATEAUとあるように、都市レベルでのコンテンツとか展開したい

世界観としてはオーディナル・スケールが近い

例えば東京タワーの下にボスキャラが現れました的な通知がアプリに届いて、みんなでそれを倒しに行くとか。

今回はゾンビサバイバルだから銃にしましたが、ファンタジー系にするなら魔法とかもありですよね。流石に剣とかは難しいですが、何かを飛ばす系なら簡単にできそう。

こういうのってすでにポケGOとかでは一部実現されていて、スポットに人々がワラワラ集まってきてポケGOやってるのとこたまに見ます。

これにアクション性と協力的な要素を加えれば、それはコミュニケーションにもなって、ソーシャルアプリとして発展するんじゃないかなと見据えています。

最後に

本ハッカソンは、元々提供されるSDKを触ることが目的でした。
屋内の精緻な3Dモデルが含まれたVPSのSDKが提供されると聞いてこれは結構な経験値が貯まるんじゃないかと考えたからです。

想定通りメタルキングを10体くらい倒したような経験値が得られたので大満足です。
(あわよくば最終選考に残ってボリュメトリックスタジオ使いたかったけど)

だって虎ノ門ヒルズのようなリアル商業施設の屋内3DモデルとVPSを使ったゾンビサバイバルXRアプリとか初じゃないですかね。
それを作る際に出た技術課題とその解決過程とか技術屋として最もほしいものも手に入りましたし。

こんなハッカソンそうそうないですよって。
開催くださった関係者様には感謝カンゲキ雨嵐水金地火木土天冥海冥🌝

最終審査会は申し込めば誰でも行けるので、もしこの記事を読んで興味が湧いた人はぜに

この記事が気に入ったらサポートをしてみませんか?