これちのPost-it

技術ネタをペラペラと

剣を自在に振ってスライムを倒すHoloQuestを作ってみた【HoloLens+ARKit】

今回作ったもの

今回HoloQuestという、HoloLensとiPhoneを使った簡単なアクションゲームを作成しました。
HoloLensを通してiPhoneの位置にARの武器が表示され、その剣を使って敵モンスターを倒すゲームです。
youtu.be

動機

  1. 現実空間でスライムと戦ってみたかった(重要)
  2. HoloLens と ARKit を組み合わせればこんなものが作れるよというのを見せたかった・試したかった

使用した機材

  • HoloLens
    • HoloQuestが動作
      • iPhoneの位置に剣を表示
      • スライムの表示なども行う
  • iPhone6s(iOS11)
    • HoloControllerアプリが動作
      • ARKitを使い自身のpositionとrotationを取得
      • 自身のpositionとrotationをHoloLensに送信
    • コントローラーとして使用

開発環境

  • Unity 2017.1.1f1
    • HoloQuestとHoloClientの実装
  • Visual Studio 2017
    • HoloQuestアプリのビルドに使用

お借りした素材

実装

剣をiPhoneの位置に表示

どうやって剣をiPhoneの位置に追従させて表示させるかのイメージ図がこちら。
f:id:korechi:20171004104458p:plain
それではiPhone側で動作するHoloClientアプリと、HoloLens側で動作するHoloQuestの実装それぞれについて説明します。

HoloClient(iPhone側)の実装

iPhone側で動作するアプリは非常に単純で、必要とした機能は以下の2つです。
1. AR Kitを動作させ常に自身のpositionとrotationを取得
2. 自身のpositionとrotationをHoloLensに毎フレーム送信
この際には凹みさんのuOSCを使用させていただきました。
github.com
3. マーカーを画面に表示
自身の位置をHoloLensに知ってもらうために表示しています。マーカーは何でも良いです。
HoloLens側ではvuforiaというマーカー認識ソフトを使用します。

HoloQuest(HoloLens側)の実装

HoloLensとiPhoneはそれぞれが別のアプリが動作しており、どちらのアプリもアプリが起動した瞬間の自分(カメラ)の位置を(0, 0, 0)としてスタートします。
そのため、HoloLensから見てiPhoneがどこに存在するかの相対位置は分かりません。
そこで2通りの位置合わせ方法を今回使用しました。

①HoloControllerアプリをHoloLensの指定された位置で起動

手順は以下の通りです。
1. HoloQuestが起動した時にHoloLensの前に剣を表示
- 今回は(2,0,2)に表示
2. iPhoneをその剣に重ねた状態でHoloClientアプリを起動
- HoloLensからした(2,0,2)の位置がiPhoneにとっては(0,0,0)だと認識される
3. iPhoneから受信したpositionである(x,y,z)に(2,0,2)を足した場所に剣を表示し続ける
f:id:korechi:20171004113533p:plain

②vuforiaを使い、iPhone上に表示されたマーカーを認識して剣の位置を再調整

しかし、iPhoneを振り続けていると剣とiPhoneの位置がだんだんとずれていってしまいます。(原因はまだわかっていません)
そこでゲームのプレイ中に位置がずれたなーと思った時にiPhoneの位置を再調整するためにvuforiaというマーカー認識ソフトを使いました。
vuforiaの参考記事はこちら
vuforiaではマーカーを認識している間、マーカーのpositionとrotationを取得することができます。
その機能を利用し、剣がずれたなーと思った時にHoloLensの前にiPhoneを持ち上げマーカーを認識させるとiPhoneの位置が再度取得できます。
f:id:korechi:20171004114542p:plain

スライムとの戦闘

これは単純にスライムオブジェクトと剣オブジェクトにcolliderを設定し、OnCollisionEnter()で衝突を検知します。
f:id:korechi:20171004114902p:plain

OnCollisionEnter (Collider collider) {
    if (collider.gameObject.tag == “Army”) {
         this.hitPoint -= 1;
    }
}

気をつけたUI

プレイヤーは敵モンスターをどこから見るか分かりません。
後ろから見た時にモンスターの後ろ姿が見えるのは問題ないのですが、HPは常にプレイヤーの方向を向くように設定しました。

今回やらなかったこ

床・壁・天井に別テクスチャを貼る

床を芝生にしたり天井を空っぽく見せることでゲーム空間っぽい演出をしようかなーと思ったのですが今回はしませんでした。
参考記事
www.naturalsoftware.jp
理由は2つあり、1つは処理が重くなる。もう1つは視野角が狭いため敵モンスターを見ていると周りの風景があまり見えないから。 ここらへんは改善の余地ありかもしれません。

最後に

HoloLens + ARKitでゲームを作ってみましたがとても相性が良かったように思えます。
両者ともセンサーを必要としないため、どんなに歩いても問題ありません。(非常にでかい) しかし、どうしても両者の相対位置はずれてきてしまいます。
実用面で考えるならば、新しいコードレスコントローラが発売されるか、vuforia以外のもっと良い位置合わせ方法が求められると思います。
HoloQuestを実際にリリースすることはありませんが、HoloLens + ARKitは面白い組み合わせですし、可能性があると思うので、みなさまも是非お試し下さい!