Article:

AvatarMeets

2023/08/05

サマリー

AvatarMeetsは2023年7/29 - 7/30の2日間で秋葉原の大通り沿いにて開催されたVKetRealというイベントにて、HIKKYさんにご依頼を受け制作した企画です。

オレンジさんあむちゃんとの3人での制作でした。

例によってオレンジさんの動画が素晴らしいのでまずはぜひこれを御覧ください。

深度センサーを用いたモーションキャプチャーでVRのワールドの中に入り込み、実際に自宅から一般参加しているプレイヤーと手を振り合ったり、一緒にポーズを取ったり、マイクを使って会話したりして交流ができる企画です。

幅6mの巨大LEDスクリーンに、さらに床面LEDまで用いて、最大6名同時に実施出来るほか、床面にはアバターの「影」を表示することにより、平面ディスプレイでは不足する奥行きの情報を補ったり、よりいっそう「VRのキャラが自分の隣にいるんだ…!」といった感覚を体験することができます。

2日間でリアル会場では合計1000人を大きく超え、VR会場でも200人以上と、大勢の方にご体験いただくことができました。参加してくださった方々、本当にありがとうございました。

また、アプリケーションは一度もクラッシュせず、途切れることなく安定して遊んでいただくことができました。

過去作との違い

AvatarMeetsは、TFPortalと呼んでいた過去作をベースにパワーアップしています。

従来では一度に1人だけ、演出なども少なくシンプルにコミュニケーションを楽しむというものでした。一方AvatarMeetsでは6人まで同時体験でき、またアイテムのスポーンやリアクションボタンなどの豊富なお楽しみ要素により、VR内の人と積極的にコミュニケーションをとるのを躊躇ってしまう人でも楽しめるようになっています。また、詳しくは後述しますがこれらのギミックは人混みに囲まれても見える「画面上部」に情報量を増やすための仕掛けでもありました。

TFPortalに関する詳しい情報は、初回のVRJMoF、第二回の秋HubPortalもご覧ください。

High Level Architecture

AvatarMeetsではKinnectカメラを3台用いており、また姿勢推定を行うUnityアプリと、集計・送信を行うGoアプリから構成されています。 それぞれの間はwebsocketを通じて通信を行なっています。これは、NeosVRがネイティブでWebSocketをサポートしていることに由来しています。

当初はUnityとGoプログラムの間はProtoBufを使うことを検討していましたが、直接Neosと接続してデバッグが行える利便性のため、全体の通信にもWebsocketを使う決定をしました。

姿勢推定アプリ自体はUnityである必要はなかったのですが、カメラのプレビューを描画したり、またシーンビューを使うことによってすぐにモーションを確認しやすい環境であることからUnityを採用しています。これは従来作のTFPortalと同様です。

今回は新しく、それぞれのカメラのモーションキャプチャーの結果をリアルタイムに集計するプログラムを導入しています。これはGoで作成しました。 、カメラ空間を一つの空間につなぎ合わせ、またキャプチャーした人物が重複している場合は一定のルールに従ってマージを行います。

マーカーの導入

TFPortalをAvatarMeetsへ進化させるにあたり、「同時にプレイできる人を増やす」という課題がありました。 Kinect自体は一つのカメラでたくさんの人の姿勢推定ができますが、あるフレームとあるフレームの間で「どのポーズが、どの人のポーズなのか」といったことは識別できません。 また、フレームによっては一瞬他の人がフレームインして識別されてしまったり、また識別できずに一瞬だけロストしてしまうこともあります。

さらに、「ユーザーにアバターを選ばせる」というのも複数人になると地味に難しい問題です。 1人ずつ設定し、順番にステージに入ってもらう〜のような率直な方法だと、オペレーションが非常に大変です。

そこで、arucoマーカーを首から下げてもらうことにしました。

↑Hikkyさんが制作してくださった首さげマーカー。切り抜かれていてかわいい!

arucoマーカーはARの文脈でよく使われるマーカーで、カメラで読み込んでマーカーの上に3Dモデルを立体的に表示するなどの用途でよく使われていますね。 あらかじめそれが何センチの大きさのマーカーなのかがわかっていれば、かなり正確にマーカーの位置と回転を取得することができます。

これにより、人物同士が接近していても前後感覚が取れるので、かなり正確にポーズをIDすることができます。 また、アバターの選択も首から下げるタグを選ぶだけで完了するので、何よりオペレーションが楽ちんです。

arucoマーカー自体の使い道としては若干異なるような気もするのですが、非常にシンプルな方法で個人的には気に入っています。他には例えばiPhoneの位置をUWBなどの測位を用いる方法などを検討していましたが、マーカーのほうが楽でわかりやすいですよね。

なにしろ、こういった体験者にも「楽しく遊ぶスキルを要求する」系のアトラクションでは「魔法にしすぎない」ことが大事だと思いました。

魔法すぎる作りにするより、「このマーカーを認識しているんだ!」ってことが伝わったほうが、「なんかよくわからないけどうまく行かない…」とならず、「マーカーが読み込めてないのかな?」と、自分で解決策を模索できます。

ギミックの追加

今回大きく2つの要素が追加されています。それは「絵文字リアクション」と「アイテムスポーン」です。

AvatarMeets企画において、遠くから人混み越しにでも「何かやってる!」と興味を持ってもらえる雰囲気を作ることが課題の一つとしてありました。 この時、重要となるのは画面の上部です。

avatarmeetsではアバターは地面に着地しており、人混みと同じ高さとなってしまいます。 そこで、画面下部に「リアクションボタン」を設置し、これを押すと画面上部からその絵文字の画像が降ってくるようなギミックを追加しました。

アイテムスポーン

手を上に上げてキープするとその手にNeosVRでよく遊ばれるおもちゃのアイテムがランダムに一定時間付与されるようにしました。

これは単純に「手を上げるだけでガチャが引けて楽しい!」というのもありますし、シンプルに手を上げている人というのは目立ちますから、これもまた遠くの人への訴求力を上げる狙いがありました。

リアクションボタン

画面下部にボタンを設置し、押すと「偉業」や「草」などのリアクションが画面上部から降ってくるようになるギミックです。

このギミックも、遠くから視認可能な画面上部に情報量を増やすために作られました。

また、このギミックは「リアルの人も、バーチャルにいる人も、両方が同じギミックで遊べる」という視点もありました。

影の表示

リアルの人のアバターの影と、バーチャルの人のアバターの両方の影を床面ディスプレイに表示しています。

また、足の位置がわかりやすいように足裏だけ影でなくカラーで表示されるようになっています。(これは肉球が見たかったからだけではありません!)

幅6Mとは言え同時に6人がステージに立つと若干狭く、影がギチギチになってしまい実感が湧きにくいところはありましたが、 実際に隣に人がいないのにバーチャルな人の影が迫ってくると、「そこにいるのか!」という感覚が湧き上がってきます。

うちわ

当日うちわの配布をおこなっていました。うちわには同じくarucoマーカーを印刷しており、認識時にアバターにもうちわが装着されるようになっています。

当日は酷暑でしたから、うちわは普通に欲しいアイテムでありましたし、大きくマーカーを印刷しているので、「このマーカーを使ってなにか遊べるのかも!」ということを素早く人々につたえることができます。

最初はYOLOなどの物体認識を用いたい気持ちがあったのですが、うちわは印刷により見た目が大きく変わってしまうこと、背景が人混みで情報量が大きく変動することから若干の不安があったので、確実な方法をということでマーカーを選択しました。

また、マーカーが印刷されていが方が「このマーカーを使って遊べる企画があるのかな!?」ということを素早く人々に伝えることができるので、そういった意味でもマーカーを印刷したことは正解だったような気がします。

謝辞

2日間でリアル会場では合計1000人を大きく超える、大勢の方にご体験いただくことができました。 今年はじめにイベントの一部の小さなブースで行なっていた企画がここまで大きくなるなんてと、心からまず驚いています。

まず何より、この企画をこの規模でやらないかと声をかけてくださったHIKKYさんに感謝申し上げます。 幅6Mで、しかも床面までLEDディスプレイを使ってやろう!という斬新すぎる発想はあまりにも凡人には思いつくものではなく、本当に貴重な機会をいただけました。ありがとうございました!

そして!VRで参加してくださった方々、本当にありがとうございました! ログを見てみるとセッションにはユニークユーザーでなんと合計200人以上も来てくださったようで驚きました。

↑イベント終了後に取った集合写真。現地にいたスタッフ(僕、オレンジさん、あむちゃん)のアバターも配置して頂きました。

Neos民には朝早い9時から会場にいてくれて、設営中にマイクでおはようございます~の挨拶ができたのがとても嬉しかったです。一緒に盛り上げてくれてありがとう!