VR 研究記

3D技術の経験を活かして、VRに挑戦するおっさんの奮闘記

Oculus APIについて

Oculus APIとデバイスバージョンの関係

  OculusのダウンロードページよりDL出来るAPI(Application Platform Interface)のこと。
私が、試験的に使用していたのはOculus DK2(以後、DK2とする)です。
正式版との違いは、トラッキングバイスに相違がある点です。

あとは、ドライバーも違っているようで、最新のドライバではDK2をコントロールする事は出来ませんでした。

開発言語は、C++, Unity(C#, Java Script), Unreal Engine(C++)に対応しています。

■Oculus DK2の開発環境

OS ドライバ バージョン SDKバージョン Unity Package Version
Windows Oculus Runtime for Windows v0.4.3-beta Oculus SDK for Windows v0.4.3-beta *1 Unity v4.5.5
Mac Oculus Runtime for OS X v0.4.3-beta Oculus SDK for OS X v0.4.3-beta Unity v4.5.5

Oculus Riftの開発環境
Setup Tool
Oculus Platform SDK *2

Oculus の構成

Windows上でUnityを使った際の構成を画像で示します。

f:id:subrutm:20161020230956p:plain

Oculus の相関図

OVR系クラスの主要なクラスの相関図を以下の画像にまとめました。
f:id:subrutm:20161021224434p:plain

クラスのメンバ変数・メンバ関数 説明

上記、相関図のクラスのうちの主用なクラスのメンバ変数及びメンバ関数を示します。
調査環境は、Unity v5.x, Oculus Utilities for Unity 5 v1.8.0です。

■OVRManagerクラス

OVR系APIの中心的なクラスです。
このクラスを中心に周囲のクラスを管理しています。

インスタンス

R: Read
W: Write

+メンバ名称 型名 属性 役割
+instance OVRManager R OVRManagerのインスタンス
+display OVRDisplay R 有効なディスプレイへの参照
+tracker OVRTracker R 有効なセンサーへの参照
+boundary OVRBoundary R 有効な検出領域設定への参照*3
+profile OVRProfile R ユーザの設定情報や身体情報など

●イベントをトリガーにしたコールバック系

+メンバ名称 型名 属性 役割
+HMDAcquired event Action - HMDが割り当てられた
+HMDLost event Action - HMDが認識されなくなった
+HMDMounted event Action - HMDがユーザーの頭に嵌った
+HMDUnmounted event Action - HMDがユーザーの頭から離れた
+VrFocusAcquired event Action - VR焦点を得られた
+VrFocusLost event Action - VR焦点を失った
+AudioOutChanged event Action - 音出力デバイスの変更とリスタートが必要
+AudioInChanged event Action - 音入力デバイスの変更とリスタートが必要
+TrackingAcquired event Action - センサーがトラッキング対象を得た
+TrackingLost event Action - センサーがトラッキング対象を失った
+HSWDismissed event Action - 『Health & Safety Warning』というウィンドウが消えた

※『Health & Safety Warning』とは・・・

以下の画像のように表示される注意書きのウィンドウの事で、何かキーを押すことで消えます。
f:id:subrutm:20161021104216p:plain


●状態チェック・設定系

R: Read
W: Write

メンバ名称 型名 属性 初期値 役割
+isHmdPresent bool R / W - trueなら、接続されていて存在している
+audioOutId string R - 音声出力デバイス識別子*4
+audioInId string R - 音声入力デバイス識別子*5
+hasVrFocus bool R - trueなら、アプリケーションはVR Forcusを持っている
+isHSWDisplayed bool R false 常にfalse(必ず表示する)
+DismissHSWDisplay bool - - 使用されていない
chromatic bool R / W - trueなら、テクスチャーの帯域幅をコストにして色彩を改善する。
monoscopic bool R / W - trueなら、両眼は同じ絵を見る。(両眼の中心で描画する、パフォーマンスを節約し快適にする)
queueAhead bool R / W true trueなら、描画処理の映像のゆがみをCPU-GPUをパラレルで動かすことで1/4フレーム高速化する
useRecommendedMSAALevel bool R / W false trueなら、Unityがハードウェアのパフォーマンス・クォリティーに合った最適なアンチエイリアシングレベルを設定する
enableAdaptiveResolution bool R / W false trueなら、動的アクセラレーションを許容する
maxRenderScale float R / W 1.0f アプリケーションが適応可能な解像度モードの最大倍率を設定[設定可能範囲: 0.5~2.0f]*6
minRenderScale float R / W 0.7f アプリケーションが適応可能な解像度モードの最小倍率を設定[設定可能範囲: 0.5~2.0f]*7
vsyncCount int R / W - FPS(Frame per seconds)の値
+batteryLevel float R - バッテリ残量を取得
+batteryTemperature float R - バッテリの温度を取得
+batteryStatus int R - バッテリの状態を取得
+volumeLevel int R - 音量レベルを取得
+cpuLevel int R - CPU性能のレベルを取得
+cpuLevel int R / W - CPU性能のレベルを取得
+gpuLevel int R / W - GPU性能のレベルを取得
+isPowerSavingActive bool R / W - trueなら、CPU/GPUの使用電源を抑える
+trackingOriginType OVRManager.TrackingOrigin R / W - ラッキング対象の種別(EYE LEVEL, FLOOR LEVEL)
usePositionTracking bool R / W true trueなら、位置トラッキング機能をOVRCameraRigのカメラと同期する
useIPDInPositionTracking bool R / W true trueなら、ユーザーの目と目の距離をOVRCameraRigのカメラと同期する
resetTrackerOnLoad bool R / W false trueなら、各シーンをロードする度に頭の位置をリセットします。(原点とベクトルを再設定する)
isSupportedPlatform bool R - trueなら、VRがPlatformに対応している
isUserPresent bool R - trueなら、ユーザーがHMDを着用している

●外部から参照できる関数

メンバ関数名称 戻り値 引数 役割
ReturnToLauncher - - 関数をコールするとアプリやゲームから離れて、ランチャーメニュー/ダッシュボードに戻る
+PlatformUIConfirmQuit - - 関数をコールすると終了選択画面が表示される
+PlatformUIGlobalMenu - - 関数をコールするとグローバルメニュー画面が表示される

まとめ

Deviceまわりの設定は、OVRManagerである程度機能する事が見えてきたと思います。
各メンバ変数のアクセス方法は、以下の通りとなります。

	void test() {
		// staticなメンバの場合は、以下の書き方でアクセス可能です。
		if( OVRManager.isHmdPresent ) {
			// HMDが有効で使える状態でする処理を書く
		}

		// 通常のpublicメンバの場合は、以下の書き方でアクセス可能です。
		OVRManager.instance.usePositionTracking = false;
	}

*1:DK2向けのSDKは、C++によるライブラリやAPIサンプルコードが入ってました。

*2:2016/10/20現在 最新バージョン。

*3:センサーが検知する空間の境界, VIVEとかが参考に成るかもしれない

*4:Windows audio endpointが使用するためのIMMDevice(Multi Media Device Interface)のUUID(Unique User ID)を得る

*5:Windows audio endpointが使用するためのIMMDevice(Multi Media Device Interface)のUUID(Unique User ID)を得る

*6:enableAdaptiveResolutionが有効になっていることが前提

*7:enableAdaptiveResolutionが有効になっていることが前提