#ChannelPlayerには、HMDデバイス向けには、Fove/RIFT両方で動くバージョンとOculus Store専用バージョンがある。VR動画再生時に使うカメラは、それぞれ異なり、前者は普通のカメラにFove Interface 2をアタッチしたものをFoveの時はそのままで、Riftの時にはFove Interface 2を無効にして実装している。またOculus Store専用バージョンでは普通のカメラではなく、申請時のチェックが通るようOVRCameraRigを使うのでカメラ制御のやり方が少し変わってしまい、試行錯誤している。同じプロジェクトでifdef使ってというやり方もあるのだが、GameObjectが異なるのは面倒なので現在は別のプロジェクトになっている。
Fove/RIFT両方で動くバージョンは、昨日Ver1.06にしたが、Store専用バージョンは未だVer1.04なので、Ver1.06になるようカメラの向きなどの制御のコードを持ってきた。
先に書いたようにカメラが異なるので同じコードでは、思ったように動かない。
まず、Foveは以前にも書いたが、カメラ固定には
XRDevice.DisableAutoXRCameraTracking(_camera, true);
は利かない。その代わりFoveInterfaceBase.csに手を入れて、camera_control_by_systemを無効にするとカメラ固定できるようにした。
protected void EnsureLocalDataConcurrency()
{
if (!enabled)
return;
CheckStaticConcurrency();
if (_localDataIsCurrent)
return;
if (_isAuthoritative && camera_control_by_system)
{
// position head
if (position)
またついでに以下のようなコードも追加した。理由はRiftで動作させるときに、FoveInterface2を無効にしても内部ではライブラリ側が動いていて、FOVEがシステムに無いことを示すエラーログが出力されるのでそれを抑止するためのものである。
private void Start()
{
if (XRDevice.model != "Oculus Rift CV1")
{
StartHelper();
}
}
なおカメラ固定にはRiftでは普通のカメラならUnityが用意した「XRDevice.DisableAutoXRCameraTracking」が使えるが、OVRCameraRigでは効かないので、その代わり以下を使う。
OVRManager.instance.usePositionTracking = false;
OVRManager.instance.useRotationTracking = false;
また、それとは別に、カメラの向きをXboxコントローラーのスティックで任意の方向に変更しつつ、HMDトラッキングオンを実現するには、カメラを付けたGameObjectの親のPositionやRotationを変更すれば良い。
// カメラの位置と角度を変更
if (!_fixed)
{
// 非固定の場合
trackingPos = trackingPos + newPos;
//trackingRot = trackingRot * newRot;
trackingRot = Quaternion.Slerp(trackingRot, newRot, 0.5f);
}
else
{ // 固定の場合
trackingPos = basePos + newPos;
//trackingRot = baseRot * newRot;
trackingRot = Quaternion.Slerp(baseRot, newRot, 0.5f);
}