当Cave项目中需要通过手柄的触摸板或其他除头盔的控制方式来控制镜头旋转和移动时的解决方案。相Unity和UE4中都有方法控制相机是否跟随头盔位置和旋转朝向
先说下Unity里的SteamVR,控制开关相机跟随头盔位置和旋转朝向的变量属性或者方法
unity引擎中已经给了一个变量属性来控制相机不跟随头盔。因此如果只是控制相机不跟随头盔只需要在初始化时将下面这个属性设成true就可以了。
UnityEngine.XR.InputTracking.disablePositionalTracking = true;
位置的跟随方便解决,相应的旋转视角的跟随也已经给了个方法进行设置。麻烦在我们找不到这个方法。关闭相机跟随头盔旋转的也有对应的方法,下面的函数就是关闭相机旋转跟随的,参数第一个是需要关闭的哪个相机,第二个就是是否关闭
UnityEngine.XR.XRDevice.DisableAutoXRCameraTracking(camera, true);
接下去就可以另外控制相机的旋转以及位置移动了。
需要注意Unity提供的XR模块中,该方法在新版本中已经取消,目前测试2018之前(包括2018版可用)新版本由于后来没碰到过需要该功能也就没有去研究,如果有朋友研究过麻烦告知或者评论区评论下。谢谢
下面是我写的通过手柄的触摸板控制相机旋转和移动的代码
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");
//获取手柄触摸板的数值
Vector2 TouchPos = m_Touch.GetAxis(SteamVR_Input_Sources.Any);
//更新相机角度
RotAngle += (TouchPos.x* RotSpeed);
//设置相机角度
PlayerCamera.transform.rotation = Quaternion.Euler(0, RotAngle, 0);
//设定初始向量
Vector3 dir = new Vector3(0, 0, 1);
//获取当前相机超前方向的向量
Vector3 newVector = Quaternion.Euler(0, RotAngle, 0) * dir;
//这里我拿个变量接了下数据,按理说不用接,但我不知道为什么不拿个临时变量接数据移动时方向是反的,乘以-1后也是反的。
float speed = TouchPos.y;
//设置相机的偏移(移动相机)
PlayerCamera.transform.Translate(newVector * speed * Time.deltaTime* MoveSpeed, Space.World);//前后移动
}
最后说下UE4中开关相机跟随头盔位置和旋转朝向的属性节点
相机属性中CameraOptions中有下面这个Lock to Hmd这个属性,将这个勾取消相机就不会再跟随头盔移动和旋转了。
设置某个相机不受头盔控制的蓝图节点,就是通过相机变量找到LocktoHmd属性