IKEPの制作ブログ

学生エンジニアIKEPの制作ブログです。作品の技術話や制作での経験談などを書いています。

「駆け出しだった大学生」がVRコンテストで2作品作って準優勝したお話

今年、IVRC 2021 (Interverse Virtual Reality Challenge)に参加してVRインタラクティブ作品を制作しました。 約半年の活動がようやく落ち着いたので、その活動について書きます。 f:id:IKEP:20211222171158j:plain

IVRCとは

IVRC(Interverse Virtual Reality Challenge)のサイトに書いてあるとおりなのですが、

IVRCは1993年から続く、学生を中心としたチームでインタラクティブ作品を企画・制作するチャレンジです。VRを取り巻く環境が大きく変化した2020年、次の時代のVRコミュニティを生み出すため、大きく変わりました。

Interverse Virtual Reality Challengeとあるように、つまりはVRとかHCIなどの作品を作ろうという、主に学生向けのチャレンジ、コンテストです。 ただ、個人的にはただ単純なVRやHCIの作品でOKという感じではなく、新しい何かが存在する作品を作ろうという印象があります。

IKEPとIVRC

実は私自身はIVRCに出場するのは初めてではなく、2017年にも出場していました。 その時のこともこちらに書いてます(これがあったので本記事のタイトルに「駆け出しだった大学生」を入れたw)。 当時はプログラミングも初めて半年ほどで、未熟だったためIVRCに参加できたのはマグレだったのですが、他の人たちの作品に圧倒されたのをよく覚えていますw ただ、この時からVRが面白いと思ってVRを中心にモノづくりにのめり込むようになったので、いい思い出です。

2017年の翌年の2018年も応募はしていたのですが書類選考で落ちたので、4年ぶりのIVRC参加となりました。

また、プライベートでもIVRCのコミュニティを通して大きな進展があったので、個人的には非常に思入れの強いコンテストです(IVRCに関わっている方々に本当に感謝です)。

なんで、再び参加したの?

友人がIVRCに参加しようかなと考えているのを聞いて、面白そうだから企画アイデアだしの話だけ聞くかと顔を出しただけでした。 その結果、思った以上に面白いものを作ることになり、これは参加するしかないとなったからですw

その友人自身は学生最後だからというのもあったそうですが、自分も少しそういった考えもあったかもしれません。

企画アイデアだしと企画書応募

自分を含め5人のメンバーが集まりました。 コロナ渦ということもあり、リモートで企画アイデアだしをしました。 zoomで話しながらとmiroにそれぞれのアイデア(単語レベルのアイデア)を書いて、その後、面白そうなものをそれぞれがピックアップしました。 ピックアップしたものを組み合わせたり、そこからさらにアイデアを派生したりして、作品のコアとなる新しい体験を考えました。 ある程度体験させたいことが決まったら、それが現実的に・技術的に可能かどうかを検討してOKなものを企画書として提出することにしました。

企画アイデアだしの結果2つの企画まで絞ったのですが、どちらもアイデアを捨てるにはもったいないぐらい面白いと考え、どちらかが企画書選考を通過すればラッキー!ぐらいの気持ちで2作品分の企画書を提出しました。

結果、どちらの企画も企画書選考を通過しました🎉 制作・開発の期間やチームメンバー個々人の大学生活との掛け持ちを考えても2作品両方を制作するのは、大変なのは目に見えていましたが、「せっかくなら」という気持ちと、体験のコアとなる部分は最低限作れるだろうという考えで、2作品を作成することにしました(実際、めちゃくちゃ時間をとられたので、大学生活などとの掛け持ちにかなり苦労した...)

何を作ったの?

mirror ⇄ ɿoɿɿim

1つ目は「mirror ⇄ ɿoɿɿim」という作品です。

本企画では,一般的なHMDを装着したまま終始VR空間内で体験するコンテンツとは違い,現実空間とVR空間の両方の空間を使用するコンテンツ体験を目指し,HMDのつけ外しによる「現実世界」と「鏡の世界」の自由な行き来が積極的に呼び起こされるコンテンツを制作する.「鏡の世界」において行動感覚の左右反転などの現実では不可能なVRならではの感覚を提示することで,プレイヤーは現実空間とVR空間の行き来の中で現実空間の感覚とVR空間の感覚の違いを強く感じ,特殊なVR空間への没入感が増幅される.また,「現実世界」と「鏡の世界」が相互に影響していると感じさせることで,現実空間とVR空間の両方を楽しむことのできるコンテンツ体験を可能にする.

ポイントとしては、

  • HMDの付け外しを誘発することによって現実空間、バーチャル空間の両空間を行き来する体験
  • オブジェクト配置位置の異なる空間でも移動感覚提示方法を変化させることによって、空間間の整合性を保つ仕掛け

の2点だと考えています。

mimiclear

2つ目は「mimiclear」という作品です。

本企画はプレイヤーの体から出る普通の影とプロジェクタによって投影されるバーチャルな影が混在するスクリーンで影とのインタラクションを楽しむコンテンツである.バーチャル影はプレイヤーの影と全く同じ見た目,動きをするためプレイヤーはスクリーンに映る影が自分自身の影かバーチャル影かがわからなくなり,プレイヤーの影もインタラクションできるコンテンツの一部として利用可能になる.また,バーチャル影として「過去のバーチャル影」「現在のバーチャル影」「未来のバーチャル影」を投影することで,過去・現在・未来という違う時点の自分の姿とインタラクションでき,従来のプロジェクションコンテンツにはない時空を超えた体験を可能にする.

ポイントとしては、

  • バーチャルな影だけではなく、実影も利用するように組み込んだコンテンツ
  • 過去・現在だけでなく、機械学習を用いた未来の姿勢推定を用いたコンテンツ

の2点だと考えています。

リモートでの開発

企画書選考を行っているうちに必要なタスクを洗い出し、それぞれのタスクの担当を決めました。 それぞれ、やりたいことを優先しつつ、概ねそれぞれが得意な領域で貢献できるようになったと思っています。 役割分担は以下のような形でした。

  • mirror ⇄ ɿoɿɿim
    • 鏡世界反転移動システム(UnityでのデフォルトVRシステムのハック、映像提示)→IKEP担当
    • パズルゲーム(Unity)
    • アンサーボード(PythonでのMNIST実装&VRへのiPadの映像流し込み)
    • 現実空間宝箱(Arduinoでのモータ制御)
    • VRモデリング(Blender)
    • 現実空間の大工作業
  • mimiclear
    • 影映像提示(Kinect&Unity)→IKEP担当
    • VRコントローラでの影攻撃(Unity)→IKEP担当
    • 未来影用アバターの自動リグ付けパイプライン(Unity&Blender)→IKEP担当
    • 未来影用アバターのmesh生成(PythonでのPIFuHD実装)
    • 光源切り替え制御(C#からのPillips Hue利用)
    • プロジェクタ選定、投影位置、画角検討

開発もコロナ渦ということもあり、ほとんどリモートでの開発でした。 GitHubでコードを共有しつつ、ある程度機能ができるごとにプルリクエストを出してレビュー → OKならマージという一般的な形で進めていました。 最初チームメンバー3/5人がGitHubを知らなかったですが、最初に講習をおこなって使い方を教えたら最低限pushとプルリクはしてくれました(優秀なチームメンバーに感謝)。 ただ、いきなりCLIのコマンドでの操作はハードルが高いと考え、GitHub Desktopを使う形で講習しました。

講習スライド一部抜粋↓ f:id:IKEP:20211211211840p:plain f:id:IKEP:20211211212006p:plain

週一で各自の進捗や問題点を話すミーティングをしつつ、リアル/対面でないと確認できない確認作業や、プロトタイプテストでは数回集まって開発を行っていました。 研究室がGatherを導入しているため、作業している時はGatherをつけっぱなしで作業して、気軽に話せる環境になっていたと思います。

プロトタイプテストをしている様子↓ (mimiclearのバーチャル影を実影に似せる方法を模索していた) f:id:IKEP:20211211215617p:plain

個人的に大変だった実装

mirror ⇄ ɿoɿɿimのコントローラ位置補正

mirror ⇄ ɿoɿɿimでは、VRで鏡の世界の移動感覚提示を行うために、鏡と垂直な方向の移動と高さ方向の回転については、通常のVRシステムとは反転しています(詳しくはこちら)。 すると、当然VRコントローラは右手コントローラが左手位置に、左手コントローラは右手位置にくるのが鏡空間としては正しいわけです。 しかし、これは非常に操作がしにくいので、右手コントローラが右手位置に、左手コントローラは左手位置にくるように修正しています。 具体的には、通常のVRシステムでのカメラ座標系でのコントローラ相対位置を、鏡カメラ座標系での位置にしてあげるだけです(悩んだあげく結構簡単)。

     // Update()でカメラの位置計算を行うので、LateUpdateを使うことで鏡世界カメラの位置を取得可能に
    void LateUpdate()
    {   
        // 基本的にコントローラの回転はそのまま取り込むが、Y軸回転のみ鏡カメラの回転と整合をとる
        var mirrorRot = originHand.rotation.eulerAngles;
        mirrorRot.y += mirrorCamera.rotation.eulerAngles.y - originCamera.rotation.eulerAngles.y;
        mirrorHand.transform.rotation = Quaternion.Euler(mirrorRot);


        // HMDオリジナルカメラ座標系でのコントローラ相対位置を、鏡世界カメラ座標系に反映。
        // 鏡世界だと本来は右手に左手コントローラを持つようになるが、コントローラのみは通常世界の持ち方を反映する
        var originCameraRelative = originCamera.InverseTransformPoint(originHand.position);
        var mirrorPos = mirrorCamera.TransformPoint(originCameraRelative);
        mirrorHand.transform.position = mirrorPos;

        // 鏡世界の本来の位置計算は
        // var mirrorPos = originHand.position;
        // mirrorPos.x = -mirrorPos.x;
        // mirrorHand.transform.position = mirrorPos;
    }

mimiclearの複数影

mimiclearのバーチャル影はKinectから渡される人領域情報を使っているのですが、Opening&Closing処理をすることにより影領域内の穴(欠損ノイズ)を埋めています。 また、ガウシアンフィルターによるぼかし処理もすることで、実影に似たソフトシャドウ感を出しています。

これが複数の過去、現在、未来影1つ1つに行われているため、高速化するために上記の処理をGPGPUで自前実装しています。 テクスチャデータ管理をしっかりしないとメモリを食い尽くして体験中にUnityが落ちるので、メモリ節約作業がなかなか神経を使う作業でした。

過去、現在影による複数影実装ができて1人ダチョウ倶楽部をしているIKEP↓ f:id:IKEP:20211211223325p:plain

ぼかし実装 f:id:IKEP:20211211223405p:plain

mimiclearの完全自動リアルアバター生成

未来の姿勢推定、人の姿のmesh生成(PIFuHD)は既存の機械学習手法でできるということがわかっていたのですが、meshを推定した姿勢にするにはmeshがリグ付けされたアバター(Humanoidモデル)である必要があります。 これを行うためにUnityとBlenderKinectからの情報を使って完全自動リグ付けパイプラインを自前実装しました。 詳細は上述した動画に載せている通りなのですが、また別途記事を書きたいと思います。


追記: 完全自動リアルアバター生成の記事を書きました。

ikep.hatenablog.com

SEED STAGE

書類選考を通過した作品はSEED STAGEで審査員の方々に体験してもらう「体験審査会」が行われる予定でした。 しかし、2021年8月ごろにおけるCOVID-19の感染拡大状況では厳しいとの判断で、動画でのオンライン審査になりました。 関係者のみの非公開なYouTubeライブで参加者が提出した作品説明動画を見て、審査員の方々がリアルタイムにコメントをしていくような形でした。

また、SEED STAGEでは日本VR学会でのポスター発表も行いました。 Binaural Meetというツールで、ポスター画像の近くにいる人どうしで音声会話でコミュニケーションをとる形でした。

f:id:IKEP:20211213201935p:plainf:id:IKEP:20211213201950p:plain

学会での発表という形をとっているので、当然学会発表原稿も書いており、文書として記録に残るのはありがたいことだなと。

Binaural Meetでは、いろいろな協賛企業の方や他チームの方とのコミュニケーションができるので、何を考えて作ったのか、なぜその方法で開発したのかなど、書類や映像だけでは伝わらない工夫点や苦労を話せたのもいい体験でした。 (それ以外にも個人的には、過去にインターンなどでお世話になった企業さんや他チームの知り合いとのコミュニケーションも取れたので、)コミュニティとしてのIVRCのすごさを感じました。(この繋がりを大事にしていきたい...)

SEED STAGEでは協賛企業様による企業賞が決まるのですが、結果としてmirror ⇄ ɿoɿɿimがUnity賞を、mimiclearがteamLab賞を受賞しました🎉 (2作品とも受賞で、チームメンバーと一緒に研究室で舞い上がって喜んでいましたwww)

Unity賞の副賞↓ f:id:IKEP:20211216214756j:plain

LEAP STAGE

LEAP STAGEは関東と関西での分散しての体験審査でした。 それぞれのチームが大掛かりな荷物を持ってきて設営→体験展示→撤収という、(コロナ禍前の)例年のIVRCの(文化祭的な)空気感があって懐かしかったです。 個人的には、mirror ⇄ ɿoɿɿimの壁(1.8m × 1m)を12枚運ぶ&2作品展示というのもあり、搬入と設営には体力気力ともに限界に近い1日でした...😅

展示中も(mimiclearの照明の関係で他チームに迷惑にならないように)2作品を同部屋で展示したのですが、2作品同時に体験ができないため、審査員の方々や体験したいと言っていただいた方に非常にお時間とご迷惑をおかけしてしまいまいました(すみませんでした...)。 そのほかにも、利用しているソフトフェアのバグ?(SteamVRがVRバイスをいっさい認識しなくなって焦った...)でトラブったりとバタバタして、ここ数年で一番大変だった1日でした。

しかしやはり、体験していただいて初めて面白さが伝わることもあり、そこから技術話になったりと大変ながらも本当に楽しい1日でした。 また、他のチームの作品を体験することもできたので、様々な刺激をもらうこともできました。

後日、オンラインでの審査会と表彰式が行われました。 審査会では、各作品ごとに動画を見た後、Q&Aにて体験会や動画を踏まえた質問に対して私たち参加者が答える形でした。 審査会と表彰式の様子はYoutubeで公開されているので、ぜひご覧ください↓

youtu.be

  • 審査会でのmimiclear: 1:28:17~
  • 審査会でのmirror ⇄ ɿoɿɿim: 1:34:05~

審査の結果、なんと「mirror ⇄ ɿoɿɿim」が2位にあたるVR学会賞を受賞しました🎉

  • 表彰式でのmirror ⇄ ɿoɿɿim: 4:35:37~

制作&参加してみて

結果として2作品合わせてですが、準優勝にあたるVR学会賞と、Unity賞、teamLab賞と3つもの賞をいただき、高く評価していただけて、すごくうれしく、貴重な経験をすることができました。 最初はなんとなくで参加しましたが、思い切って飛び込んでいくことはやっぱり大事だなと再認識しました。

また、結果論的かもしれませんが、個人的にはmimiclearはmirror ⇄ ɿoɿɿimよりも技術的に高度なことをやっていると思っていますが、mirror ⇄ ɿoɿɿimがVR学会賞を受賞しています。 mirror ⇄ ɿoɿɿimは体験のデザインだったり、モデリング、ハードウェアと、チームメンバーそれぞれの得意な能力を発揮できたと思っており、だからこそ高い評価をいただけたのかと思いました。 なので、やっぱりチームでモノづくりをすることは大事だなと感じつつ、今後チームメンバーの能力も引き出すことができるような人間になっていけたらなと感じました。

さらに、冒頭にも書きましたが、自分は2017年参加時に落ち込んでから、いろいろなところで勉強や経験を積ませていただいたおかげで、大きく成長できたし、今回の結果につながったとも思うので、多くの人に感謝し今後もその繋がりを大事にしていきたいと思います。 IVRCのコミュニティとそれに関わる多くの方々に感謝します! ありがとうございました!

(後日談)

teamLab賞の副賞がteamLabさんの展示に招待とのことだったので、チームメンバー全員で見学させていただきました! チームメンバー全員で行ったので、修学旅行感がすごかったですw

IKEPは以前インターンでお世話になったことがあるため、案内をしていただいた社員さんとはお久しぶりでした(笑)