ジョー・ヒタギの止リ木 | 「ものづくり」や「ものなおし」をするブログ

色々なものを作ったり直したりするブログです。主な話題は日用品・電子機器・エアガンなど。

ジョー・ヒタギ の 止リ木

【Unity】スマホだけで6DoFのVRを実現したサンプルプロジェクトの紹介

f:id:Jo-Bitaki:20200419203712p:plain

Qiitaにて、Unityの面白いサンプルプロジェクトを見つけました。
外部のセンサーやマーカーを使わずにスマートフォンだけで6DoF(歩いたりしゃがんだりできる)のVRを実現したものです。さらには手の動きも認識できる優れもの。

実際に試したところかなり感動したのでご紹介させてください。このプロジェクトはわりと簡単に試すことができますが、導入時につまずいた点もあるので解説します。

6DoFとは?

DoFとはDegrees of Freedomの略であり、日本語では「自由度」です。従来のスマホVRは下図のように頭の回転しか検知できない、つまりは3DoFでした。

f:id:Jo-Bitaki:20200206232800p:plain:h300


それに加えて前後左右の動き(=歩く)と上下の動き(=しゃがむ)も反映できるのが6DoFです(下図)。

f:id:Jo-Bitaki:20200206232804p:plain:h300

6DoFの実現にはセンサーがいくつも必要となり、今まではOculusやVIVEのような高価な機材しか対応していませんでした*1
しかし、最近になってiPhoneやAndroidのAR機能が強化されると、それを利用してスマートフォンのカメラだけで6DoFを実現する猛者が現れたのです。そうした方が作られた成果の一つが、今回ご紹介するサンプルプロジェクトというわけです。

スマホで6DoF&ハンドトラッキング

作者様のページはこちら。

qiita.com

以下、実際のゲーム画面。私はiPhoneXRでプレイしましたが、Androidにも対応しています。
サンプルのため、床と白い箱があるだけのシンプルな空間が表示されます。

f:id:Jo-Bitaki:20200207170741p:plain

しかし、この中を歩き回れるだけでもかなりの感動もの。
AR機能をベースにしているが、床をカメラに写さないように上を向きながら歩いてもきちんと移動が反映されていました。少なくともiOSでは壁の映像からも移動を推定できるようです。

カメラの前に手をかざすと、球体の集合のような仮想的な手が表示されます。

f:id:Jo-Bitaki:20200207170746p:plain

機械学習による画像認識を利用しているらしいですが、認識精度は結構高く、握りこぶしなども反映されます。
この学習モデルはGoogleが開発しMediaPipeで提供しているもので、画面内に複数の手が映っていてもリアルタイムで姿勢を推定できるとのこと。

ai.googleblog.com


箱に手を触れると色が黄色に変化。

f:id:Jo-Bitaki:20200207170730p:plain


その状態で手を握ると箱を持ち上げられます。

f:id:Jo-Bitaki:20200207170736p:plain

箱を奈落に落とす遊びができます。

配置された「Reset」のプレートに触れると箱が初期位置に戻ります。
なお、カメラと箱には互いに衝突判定があるようで、体当たりで箱を動かすこともできます。

導入にあたってつまずいたこと

作者様のGitHubやダウンロードしたReadMeに使い方が丁寧に書かれているので、Unityに精通した方なら簡単に導入できるでしょう。

しかし私はいくつかトラブルに遭遇したため、解決策とともに記しておきます。基本的にiOS向けの内容です。

XCodeをアップデートできない

本来ならAppStoreからアップデートできるはずですが、いつまでたっても更新が始まりませんでした。
そのため、開発者用ページに行って最新版のアプリを直接ダウンロードしました。

https://developer.apple.com/download/more/

ファイルサイズがかなり大きいため、ダウンロードに6時間近くかかりました。

なお、iOSのアプリ開発にはApple IDの開発者登録が必要です。アプリを不特定多数に配布するには有料プランへの登録が必要ですが、自分で作ったアプリを自分のデバイスで使うだけなら無料でできます。

Apple Developer

Unityのバージョン管理

今回初めて知ったのですが、いつのまにかUnity Hubというバージョン管理ソフトがリリースされていたようです。

unity3d.com

私のPCには既に古いバージョンのUnityがインストールされていたのですが、Unity Hubを問題なくインストールできて、既存のUnityのデータが消えることもありませんでした。

これ以降、別のバージョンのUnityはUnity Hub経由でインストールすることになります。

Unityの開発プラットフォームを切り替えられない

サンプルプロジェクトを動かすためにはSwitch PlatformでiOSかAndroidの開発環境に切り替える必要がありますが、当初「あなたのアカウントには権限がありません」といったエラーが表示されました。
原因はUnity本体でサインインしていなかったこと。Unity Hubの初回起動時にサインインしていたのですが、個々のUnityでも個別にサインインが必要なようです。

Switch Platformは処理に時間がかかるため、アセットなどを読み込む前に行うことをおすすめします。

UnityでのBundle Identifierの設定

「com.会社名.製品名」の形式で入力してください。会社名や製品名はApple IDとは何の関係もない適当な文字列にしても問題はありません。ただし、他人と被るとXCodeでのビルドが失敗したような気がします。

XCodeでのビルド時のTeam名の設定

「Signing & Capabilities」の「All」タブで「Automatically manage signing」を選択します。「設定が書き換わる恐れがあるがいいのか?」といった警告が出ますが、続行しても問題は起きませんでした。

その後、「Team」に適当なものを指定しておかないとビルド時にエラーが出ます。

XCodeでのビルド時に「MultiHandAppLib-fl.aが見つからない」といったエラーが出る

ReadMeに書かれたURLからUnitypackageをダウンロードし、Unityでインポートします。インポート内容は初期設定のままで大丈夫です。
その後、再度ビルドすれば解決しました。

その他 XCodeでエラーが出る

エラーの原因を修正したのにエラーが消えない場合、「Clean Build Folder」を実行してから再度ビルドすれば解決するはず。

スマホの画面表示が小さい、またはヘッドマウントディスプレイに合っていない

ゲームを起動し、Google Cardboardの設定画面から必要な設定が書き込まれたQRコードを読み込んで対応してください。

QRコードはHMDに付属してることもありますが、ないこともあります。紛失したり、設定が自分に合わなかったりすることもあるでしょう。
そうした場合は、以下のサイトのコードを試ことをおすすめします。

VR Headset QR Codes – Hypergrid Business

非常にたくさんのQRコードが掲載されているので、きっとぴったりの設定が見つかるはず。


以下のページで自分でQRコードを作ることもできます。しかし、2020年2月12日現在、Firefoxでは機能しません。

Google Cardboard

「Inter-lens distance」の設定がかなり重要らしいです。眼鏡の処方箋をお持ちなら、そこに載っている瞳孔間距離(P.D.)を参考にするといいかもしれません。

おわりに

「VR元年」といわれた2016年からわずか4年ばかりで技術は驚くほど進化しています。当時はスマホのカメラだけで6DoFとハンドトラッキングがこれほど手軽にできるようになるとは思いもよりませんでした*2

本記事によって一人でも多くの方にVR技術に興味を持っていただけたら嬉しいですし、願わくば何か面白いゲームを作っていただけたらさらに嬉しいです。

関連記事

MMD ☓ Songleの読み込みが終わらない・再生ボタンが表示されない・落ちるときの対処法

【Unity】オブジェクトの回転を別のオブジェクトと同期させるスクリプト【C#】

*1:数年前には壁に貼ったQRコード(ARマーカー)を認識したり、歩く時の上下動を感知することで、スマホでもVR空間を限定的にだが歩けるようにする試みがありました。

*2:QRコード付きの紙製指輪で大まかな動きをトラッキングするアプリはありました。