Edited at

ViveFocus+Unity


ViveFocusとは

ViveFocusはスタンドアロンで動作するVRHMDです。

PC等の機器を必要とせず単体で動かす事が可能になっています。

中国では先行して販売されていたのですが、先日国内でも販売されました。

ViveFocus

公式では法人向けにしか販売していないのですがこちらから個人でも購入出来るようです。


特徴

既にOculusGoやMirageSoloなどのスタンドアロン型のHMDが出ており、性能や機能も大体似たような物になっています。

スタンドアロン機種ごとの特徴をまとめてみました。

トラッキング
モーションコントローラ
シースルー(カメラ画像の表示)
値段(税込み)
CPU

ViveFocus
6DoF
3DoF
白黒
72090円
Snapdragon 835

ViveFocusPlus
6DoF
6DoF*2(超音波)
白黒

Snapdragon 835

MirageSolor
6DoF
3DoF
o(白黒?)
48,660円
Snapdragon 835

OculusGo
3DoF
3DoF
x
23,800円(送料込み)
Snapdragon 821

OculusQuest
6DoF
6DoF*2
輪郭
399ドル
Snapdragon 835?

OculusQuestは最後発というのもあり全ての機能が揃っているようです。

またOculusGoは機能を絞ることで廉価に抑えられています。

MirageSoloがアップデートでシースルーが使えるようになったようです。動画を見ている限りリフレッシュレートもそれなりに出ています。


セットアップ

https://qiita.com/Hirai0827/items/8cf92ea9ea42b62e178e

上記の記事ではUnity5.6.3かUnity2017でしか動かないとの事ですが、現在のWaveSDK-2.1.0ではUnity2018.1までサポートされているようです。

ですのでAndroidSDKだけ必要なバージョンを入れれば通常のAndroidのアプリとしてビルドするだけでも動作しました。

具体的にどのバージョンを入れたら良いのか分かってませんが、自分が動作確認した時に追加したのはAPIレベル28と26でした。


Unity2018.2.x対応

2018年10月末までには2018.2にも対応するとの事なのですが、今の所更新はありません。

現在のWaveSDK-2.1.0でもUnity2018.2.xでも動作はしますが、アプリ起動時に画面が真っ黒になります。

一旦HMDを外してスリープさせてHMDを被るとアプリが正常に動作します。


黒い画面が出る

上記の症状ですが、WaveVR_Render.csのOnApplicationPauseメソッドの中身をPause()としてくくり出してpublicにしてアプリケーションの起動時に無理やりPause(true)/Pause(false)を呼び出すことで解決出来るようです。

https://community.viveport.com/t5/Vive-Wave-SDK/Getting-around-the-black-screen-on-WaveSDK-2-1-0-on-Unity-2018-2/td-p/25092?__woopraid=QWlga5oMnXrt

外から呼び出さなくても

WaveVR_Render.Start内部でPause(true)/Pause(false)と呼べば解決しました。

Pause(true)とPause(false)を同一フレームで呼び出すと問題があるようなので以下のようにすることで解決しました。


WaveVR_Render.cs

    IEnumerator Start()

{
Log.d(LOG_TAG, "Start()+");
var camera = GetComponent<Camera>();
camera.cullingMask = CameraGaze ? camera.cullingMask : 0;
camera.backgroundColor = Color.black;
camera.clearFlags = CameraClearFlags.Nothing;
// Camera.main need this camera to enabled
camera.enabled = true;
camera.rect = new Rect (0.5f - 0.01f, 0.5f - 0.01f, 0.02f, 0.02f);
camera.tag = "MainCamera";

WaveVR_Render.Expand(this);
configurationChanged = false;
Log.d(LOG_TAG, "Start()-");
yield return null;
Pause(true);
yield return null;
Pause(false);
yield return null;
}


これでOculusQuestが出るまではFocusで我慢出来るようになりますね。良かった。

カメラの画像も白黒かつ20fpsくらいでよければWaveVR_CameraTextureで取れるようですし、頑張って深度値を計算すればARも実現可能です(めちゃくちゃ重たいですが)。

Let's ViveFocus!