當(dāng)Cave項(xiàng)目中需要通過手柄的觸摸板或其他除頭盔的控制方式來控制鏡頭旋轉(zhuǎn)和移動時的解
當(dāng)Cave項(xiàng)目中需要通過手柄的觸摸板或其他除頭盔的控制方式來控制鏡頭旋轉(zhuǎn)和移動時的解決方案。相Unity和UE4中都有方法控制相機(jī)是否跟隨頭盔位置和旋轉(zhuǎn)朝向
先說下Unity里的SteamVR,控制開關(guān)相機(jī)跟隨頭盔位置和旋轉(zhuǎn)朝向的變量屬性或者方法
unity引擎中已經(jīng)給了一個變量屬性來控制相機(jī)不跟隨頭盔。因此如果只是控制相機(jī)不跟隨頭盔只需要在初始化時將下面這個屬性設(shè)成true就可以了。
UnityEngine.XR.InputTracking.disablePositionalTracking = true;
位置的跟隨方便解決,相應(yīng)的旋轉(zhuǎn)視角的跟隨也已經(jīng)給了個方法進(jìn)行設(shè)置。麻煩在我們找不到這個方法。關(guān)閉相機(jī)跟隨頭盔旋轉(zhuǎn)的也有對應(yīng)的方法,下面的函數(shù)就是關(guān)閉相機(jī)旋轉(zhuǎn)跟隨的,參數(shù)第一個是需要關(guān)閉的哪個相機(jī),第二個就是是否關(guān)閉
UnityEngine.XR.XRDevice.DisableAutoXRCameraTracking(camera, true);
接下去就可以另外控制相機(jī)的旋轉(zhuǎn)以及位置移動了。

下面是我寫的通過手柄的觸摸板控制相機(jī)旋轉(zhuǎn)和移動的代碼
public void ControllerCamera()
{
SteamVR_Action_Boolean m_Teleport = SteamVR_Input.GetAction<SteamVR_Action_Boolean>("Teleport");
? ? ? ? SteamVR_Action_Vector2 m_Touch = SteamVR_Input.GetAction<SteamVR_Action_Vector2>("Touch");
? ? ? ? //獲取手柄觸摸板的數(shù)值
? ? ? ? Vector2 TouchPos = m_Touch.GetAxis(SteamVR_Input_Sources.Any);
? ? ? ? //更新相機(jī)角度
? ? ? ? RotAngle += (TouchPos.x* RotSpeed);
? ? ? ? //設(shè)置相機(jī)角度
? ? ? ?PlayerCamera.transform.rotation = Quaternion.Euler(0, RotAngle, 0);
? ? ? ?//設(shè)定初始向量
? ? ? ?Vector3 dir = new Vector3(0, 0, 1);
? ? ? ?//獲取當(dāng)前相機(jī)超前方向的向量
? ? ? ?Vector3 newVector = Quaternion.Euler(0, RotAngle, 0) * dir;
? ? ? ?//這里我拿個變量接了下數(shù)據(jù),按理說不用接,但我不知道為什么不拿個臨時變量接數(shù)據(jù)移動時方向是反的,乘以-1后也是反的。
? ? ? ?float speed = TouchPos.y;
? ? ? ?//設(shè)置相機(jī)的偏移(移動相機(jī))
? ? ? ? PlayerCamera.transform.Translate(newVector * speed * Time.deltaTime* MoveSpeed, Space.World);//前后移動
}
最后說下UE4中開關(guān)相機(jī)跟隨頭盔位置和旋轉(zhuǎn)朝向的屬性節(jié)點(diǎn)
相機(jī)屬性中CameraOptions中有下面這個Lock to Hmd這個屬性,將這個勾取消相機(jī)就不會再跟隨頭盔移動和旋轉(zhuǎn)了。

設(shè)置某個相機(jī)不受頭盔控制的藍(lán)圖節(jié)點(diǎn),就是通過相機(jī)變量找到LocktoHmd屬性
