Swampdog part8 -小休止-
前回は手持ちのスマホにUSBホスト機能が備わっておらず、SIXAXISを接続することができませんでした。
今回は一旦、ゴールを再確認して進めるべき方針を決めます。
目次
振り返り
本プロジェクトの最終形は2種類あります
- 無料版のAndroid用アプリ(学生の個人的な学習を想定)
- 有料版のHoloLens用アプリ(大学での教育や病院での症例検討を想定)
今回SIXAXISの接続に躍起になっていたのはHoloLens用アプリをイメージしてのことでした。
3Dの解剖モデルを上下左右から観察することができ、拡大縮小などもできる。
つまり椅子に座って操作盤をいじりながら観察することもできるし、実際にユーザが動き回って観察しても良いというイメージです。
この座った状態の操作の代替としてSIXAXISを使う考えでした。
一方で、Android用アプリの場合はVRゴーグルにセットして使うのを想定しています。できるだけ安価に、手軽にが信条です。
この場合は一画面での操作は首振りにカメラを対応させるぐらいが関の山です。
あとはボタンに視線を合わせたら角度変更ぐらいでしょうか。
ユーザにコントローラを用意させて接続、設定、などは多大な手間です。
HoloLens版のカメラ機能はUnity上でキーボードを使って確認しました。
あとはHoloLensの操作に合わせて置き換えるだけです。間にSIXAXISを挟む必要はありません。
Android版はVR化こそしましたがほとんど機能を確認していません。
重点的に開発するならばここです。
スクリプトにデバイスで条件分岐した括りを作り、ここに該当の処理を追加していきます。
よって今後の方針は
SIXAXIS接続- AndroidでVRアプリとして起動できるか確認
- カメラをジャイロに対応させる
- 視点切り替えのボタンを用意し、視線で操作できるようにする
です。
VRアプリ実装方法の選択肢
part6でVR化の実装が曖昧だったので新しいプロジェクトで再確認します。
やはりVR化には以下の2つの方法があるようです。
- Google VR SDK for Unityを使う
- UnityのVR support機能を使う
Google VR SDK for Unityを使う場合、Cardboard対応かDaydream対応かを選択します。
Daydreamの場合アプリを実行できる機種はNexus 6Pだけのようです。
Unity上で機能を確認するだけならできますが、広く公開できなくなってしまうのでUnityのVR support機能を使います。
ちなみに、Google VR SDK for Unityを使う方法については以下のサイトがわかりやすかったです。
ただ一年前の記事ということもあって、ところどころ状況が異なるので注意が必要です。
参考: Google VR SDK for Unityを利用してDaydream用VRアプリの開発環境を作る
プロジェクトを作成
vr_testというプロジェクト名で3Dプロジェクトを新規作成します。
3Dオブジェクトのキューブでも配置しておきます。
ちょっとカメラに近づけます。
Virtual Reality Supportedを有効にする
part6の同名の項目通りに進めます。詳細はこちらを確認してください。
「File-> Build Settings-> Player Settings」、
「Inspector-> Other Settings-> Virtual Reality Supported」にチェックします。
Virtual Reality SDKは空だと警告が出るのでとりあえずCardboardを選択しておきます。
Minimum API Levelを要求を満たすように設定します。
Bundle Identifierをよしなに記載。
「File-> Build & Run」でプラットフォームをAndroidに変更して、Buildを実行します。
Android実機でVRモードを確認
USBで実機を接続します。
AndroidのUSBデバッグが有効になっているか注意します。
Build & Runを実行します。
VRモードっぽく両眼カメラになっています。
Unityのゲームビューでは単眼カメラのままだったので確認するには実機なり、エミュレータを使う必要がありますね。
ちなみに、Androidを傾けてもカメラは追随しませんでした。
首を振った時に対応してカメラの向きが変わるように次項でジャイロ機能を実装します。
Google VR SDK for Unityを使えば、ここら辺の設定がサクッとできるけど、代わりに対応機種が限定されるということですね。
カメラをジャイロに対応させる
以下の記事を参考にしました。
結構調べましたが、Input.gyro
なるものがあるようです。
ライブラリとかに振り回されました。
UnityもC#も体系的に学んでいないのでこういうとこで躓いて時間を食います。
参考記事では左右の眼に対応したカメラオブジェクトを用意して自前で位置をずらして立体視できるようにしています。
しかしUnityのVRサポート機能を有効にすれば、アプリ実行時に自動で両眼カメラをたちあげてくれることは前項で確認しました。
ということは私の状態ではカメラを2つ用意する必要がありません。
空のオブジェクトGyroでも作ってこれにC#スクリプトを突っ込めば良さそうです。
gyro.csの中身は実にシンプルです。
起動時にジャイロ機能を有効にすることで常にAndroidの傾きを取得します。
その傾きに応じて常にカメラの向きを変更させます。
using System.Collections; using System.Collections; using System.Collections.Generic;using UnityEngine; public class gyro : MonoBehaviour { Quaternion gyroA; Quaternion gyroA; void Start () { Input.gyro.enabled = true; } void Update () { gyroA = Input.gyro.attitude; transform.rotation = Quaternion.Euler(0, 0, 180) * (new Quaternion(gyroA.x, -gyroA.y, gyroA.z, gyroA.w)); } }
セーブして再度Build & Runします。ちなみにショートカットキーはcommand + Bです。
しばらく待つとアプリがインストールされ、本体の傾きに応じてカメラが追従します。
補足
Quaternionの概念を理解するのに苦労しました。
スマホをVRゴーグルにセットするのを想像します。
横倒しにして、カメラが正面を向くようにセットすると思います。
このカメラの長軸に関する回転 = 首を上下に振る回転、で画面は上下に動きます。
そこらへんをうまく値を設定してあげるといいです。
Unity場でカメラの初期位置や向きを調整することでも解決できます。理解がめんどければそれで逃げるのも手かと。
ちなみに、アプリを起動するときはスマホを静置してから起動しましょう。
振り返れば当然ですが、初期位置がずれれば回転がずれてきます。
ソース書き換えてないのに、実行するたびに見える景色が90度ずれてて悩みまくりました。
スマホを縦に置いた状態でアプリ起動、横に置いた状態で起動、の違いでした。
恐怖でした。何も書き換えてないのに見える景色がずれるんですから。
初期状態の傾きによらずに使えるようにキャリブレーションを入れなくてはいけませんね。
次回
以下の項目を実装することができませんでした。
- 視点切り替えのボタンを用意し、視線で操作できるようにする
一旦保留とします。
Android用、HoloLens両方とも雛形ができたので、これからはブラッシュアップをかけていきます。
さしあたって、OsiriX側に戻って骨の分離や別組織の3Dモデル構築を行おうかと思います。