OculusRoomみたいなアプリを作りたい

概要

OculusPlatformSDKを使ってVoIPで音声通話するまでの記事を書きます(の予定です)

今回は、OculusPlatformの最初の使い方を書いていこうと思います。

はじめに

OculusGoでOculusRoomみたいなアプリを作りたい。

みんなそう思いますよね。

私はUnityチョットワカリマス。

なので、VR側のUIはUnityで行こう。

じゃあ、ネットワーク機能ってどうやって実装しよう?

ネットワーク機能の選定

ネットワークって難しい、、

現在エンジニア歴2年目プログラミング歴2年目。

やっぱ楽したいなって思っちゃうんですよね。

私が考えた最初の選択肢は、これ。

  • UNET
    • やっぱりUnity標準!
  • Photon
    • なんだろうこれ。でもみんな使ってるぞ

僕は以前UNETを使ってHoloLensとOculusGoで同期させたことがありました、が、結構苦労しました。

http://motoyama.hateblo.jp/entry/unet-00

その際にお世話になったバイブルがこちらです。

 

この記事を読んでUNETめっちゃ神。。

1つのコードでサーバーもクライアントも書けるなんて最高では??

そんな風に思っていた時期が僕にもありました。

 

いざ実装してみて、自分の理解不足もあり、めちゃくちゃ苦労してしまいました。

なんで同期されてないのか良く分からないなんて事が多発。

実装中にUNETの次のネットワーク機能が完全に出ると発表も受け、モチベーションは一気に下がりました。

今から選択するのは無しとしました。

 

次にPhoton。

こちらも選択しませんでした。

理由は、

  • Unity、Oculus、他のベンダーの製品と繋ぎ合わせるのが怖かった
    • 実際にはかなりVRの事例があるし、みんな使ってました
  • なんかお金かかりそう。。
    • 実際には無料枠もある
  • Unityのバージョンが古そうだった

じゃあどうする?

 

僕はOculusGoだけを対象としたネットワークで良いなって思ってたんです。

 

それじゃ、Oculusが用意したものでいいじゃん!!

OculusPlatformを使おう。

選定理由はこちらです。

  • OculusのAvatarSDKなどと親和性高そう
    • 実際にはPhotonにAvatarを使うサンプルがあった。。
  • Oculusプラットフォームのみでネットワーク構成したかった
    • OculusQuestを遊んでOculusに未来を感じていた
    • ハイエンドなPCを持っているVRユーザーを対象としていなかった
  • 事例が圧倒的に少なかった
    • チャンスだと感じた(ブログを書けるなど)

などなどです。

今となってはPhotonを使った方が良いかも?なんて思ったりしてます。

この理由としては、Oculusを使わずにネットワーク機能の検証が出来ることに尽きます。

 

が、今回の開発で本当にためになったなと感じているのは、

ドキュメントを読む力が圧倒的につきました。

 

今までQiitaやはてぶなど先人の力をフルに活用していた、そっちの方が早かった。

 

けど、凄い先輩によく言われていました。Qiitaを見ずにドキュメントを見ろと。

自分も読みたいと思いつつ、必要性を感じてなかったんです。

だってQiitaにあって、ちょっと変更加えたら実現できちゃう。。。

今回はそんな甘えを一切許さず、ひたすらドキュメントを読んで苦戦し、積み上げていきました。

 

そんな私の苦闘を書いていこうと思います。

バーチャルリアリティ学1章

VR技術者認定試験

日本バーチャルリアリティ学会主催のVR技術者認定試験
この試験の範囲となっているバーチャルリアリティ学という本を大学時代からずっと読んでみたいと思っていたのでこの際試験を受けて読んでみることにしました。

バーチャルリアリティ学

バーチャルリアリティ学

バーチャルリアリティとは

一章ではVRとはなんぞやってのを語ってくれています。
その際に、Virtualを仮想と訳してあることのマズさを丁寧に教えられます。
バーチャルとはみかけや形はそのものではないが、本質あるいは効果としてはそのものであることというのが英和辞典で定義されているそうです。
だけど、仮想という言葉は仮に想定した、という本来の意味とは異なってしまうので、そこは意識して使うべきだと言っています。
VRというとヘッドマウントディスプレイをすぐに思い浮かべてしまうけど、本来の意味にたちかえれば、それは一つの手段なんだと感じた。

認知について

今実在している現実世界、だと思っているものは実は違うものなんだそう。
人間の感覚器官がフィルターとなっていて、現実だと思っているものは、フィルターを通した世界になっている。
バーチャルリアリティは、そのフィルターをシステムで作ってあげて、作り上げてあげれば良いものだと。
2章では人間の感覚を細かく解説してくれています。

道具としてのVR

ここが個人的に一番興味深かったもので、VRは、3C/3Eのための道具だと語られています。

  • 3C
    • Creation
    • Control
    • Communication
  • 3E
    • Elucidation
    • Education
    • Entertainment

今の世に出ているVRって全部この枠組みで埋めれるかも?と感じました。
TiltBrushCreation。創造するための道具。

VRで動かす遠隔ロボットはControl

OculusRooms, BigscreenCommunication

Elucidationはちょっと難しい単語ですが、解明という意味。
新たな科学的な発見のためのツール。例えば、未来予測したシミュレーション結果などをVRで体験するとかはここにあたりそう。

VRレーニング、教育はもろにEducationだし、

VRゲームやその他の娯楽もEntertainment

新しくVRを使って何か作りたいと考えた時は、ここからブレストしてみたり、今あるサービスをこの枠組みに当てはめていき、自分が作りたいサービスと同じ分野の物を参考にしたりと使えるかもしれない。

OculusGoのアプリ開発ことはじめ

OculusGoのアプリを開発する

Oculusの開発をUnityで始めてみました。
開発経験としては、HoloLensの開発が業務だったので、Oculusはあまり知見がありません。

そんなこんなで、ドキュメントを手がかりに開発を始めてみたいと思います。

Unityのインストール

Oculusドキュメントのこのページを参考にすると、

We recommend using Unity version 2017.4.11f1 for all Oculus development.

ってなわけで、Unityのバージョンは2017.4.11f1にしました。大人しく。 unity3d.com

上から、2017.4.11をダウンロード。
とか言っていますが、Windowsでのこのバージョン、なぜか自分のPCだと不調で、具体的にはGameSceneなどのウィンドウサイズを変更すると固まったりします。

Unityのバージョンは複雑ですが、2017.4というものがLTSといって、長期間に渡ってサポートしてくれるものです。
4の下の番号は、バグ改善だったりと小さいアップデートで、かつ、Oculusのドキュメントが古くなっている事も考えれば、2017.4の最新版にしても大きな問題は出ないかも?なんて思っていたり。

HoloLensの開発でUnityのバージョンには苦しめられたんで、ちょっと怖いですが、私は2017.4の最新版にあげてみようと思います。

Unityのバージョンについての参考資料

www.slideshare.net

Unityのセットアップ

OculusGo用にはこちら Preparing for Mobile Development

セットアップだけなら検索すると日本語の記事たくさん出てきたので、それも参考になりそう。

UnityでHMDをエミュレーションする

毎回毎回PCからOculusGoにbuildするなんてめっちゃめんどくさいですよね。(私はやってました。。。)
先輩によく言われるんですね、ちゃんとドキュメントを見ろと。
ありました。

https://developer.oculus.com/documentation/unity/latest/concepts/unity-hmd-emulation/

UnityEditorでOculusHMDの動きをエミュレートできます。
すこし翻訳したものを書きます。

使い方

  • OVRCameraRig, OVRPlayerController prefabをゲームシーンに入れる
  • もしくはゲームオブジェクトにOVRHeadsetEmulatorをアタッチする

エミュレーション

UnityEditorでplayした後にマウスとキーボードを使って行います。
Macはエミュレーション対応していないらしい、、、(このドキュメントが書かれた時点では)

  • ctrl + mouse > yaw(顔の左右), pitch(顔を見上げる、逆)をエミュレート
  • ctrl + alt + mouse > roll(顔を横に倒す方向)をエミュレート
  • ctrl + mouse wheel > 高さをエミュレート

ctrl離すと元の位置に戻ってしまいます(windows)

設定

OVRHeadsetEmulatorをいじって設定を変更できます。

  • OVRHeadsetEmulator.opMode
    • デフォルトはEditorOnlyでUnityEditorのみで使える
    • AlwaysOnにするとbuildした場合のアプリケーションでも使用可能になる

この辺をいじれば、デフォルトのキーバインドを変更可能になる。(OVRHeadsetEmulator.activateKeys, OVRHeadsetEmulator.pitchKeys)

Oculusのドキュメントしっかり読んでいかなきゃ。。。