Unity纸板方向横向右上下

本文关键字:上下 横向 方向 Unity | 更新日期: 2023-09-27 18:09:46

嗨,我有一个Unity应用程序,它使用谷歌Cardboard SDK来启用立体视图,所以我将有一个启用VR的应用程序。我的应用程序运行得非常好。

但如果我将播放器设置方向设置为自动方向,只允许向左和向右横向,就会出现问题。当它处于左横向时,一切正常,但当它处于右横向时,纸板视图将旋转180度(设置按钮移动到屏幕底部(,但我的统一对象没有。因此我有一个倒置的物体。

有什么方法可以解决这个问题吗?

谢谢。

Unity纸板方向横向右上下

SDK用于读取陀螺仪的本地代码似乎只针对横向向左方向进行了硬编码。这可以通过编辑BaseCardboardDevice.cs并用以下代码替换UpdateState((的定义来解决:

private Quaternion fixOrientation;
public override void UpdateState() {
  GetHeadPose(headData, Time.smoothDeltaTime);
  ExtractMatrix(ref headView, headData);
  headPose.SetRightHanded(headView.inverse);
  // Fix head pose based on device orientation (since native code assumes Landscape Left).
  switch (Input.deviceOrientation) {
    case DeviceOrientation.LandscapeLeft:
      fixOrientation = Quaternion.identity;
      return;
    case DeviceOrientation.LandscapeRight:
      fixOrientation = Quaternion.Euler(0, 0, 180);
      break;
  }
  headPose.Set(headPose.Position, headPose.Orientation * fixOrientation);
}

我建议在Cardboard设置中也关闭"颈部模型比例"(将其设置为0(,因为这段代码不会正确显示。

我已经解决了这个问题,这是解决方案(适用于Cardboard v0.5.2(

首先,根据smd的建议,您需要在BaseCardboardDevice/UpdateState((中应用方向调整。但是,您应该选中ScreenOrientation而不是DeviceOrientation。代码如下:

public override void UpdateState() {
    ProcessEvents();
    GetHeadPose(headData);
    ExtractMatrix(ref headView, headData);
    headPose.SetRightHanded(headView.inverse);
    if (Screen.orientation == ScreenOrientation.LandscapeRight) {
        headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0, 0, 180));                           // Workaround
}

这将修复方向,但这还不够,因为在Cardboard Recenter((之后,您将面临错误的方向。为了解决这个问题,你还需要在CardboardHead/UpdateHead((方法中应用旋转,代码如下:

private void UpdateHead() {
    if (updated) {  // Only one update per frame, please.
      return;
    }
    updated = true;
    Cardboard.SDK.UpdateState();
    if (trackRotation) {
      var rot = Cardboard.SDK.HeadPose.Orientation;
      if (Screen.orientation == ScreenOrientation.LandscapeRight) {
        rot = Quaternion.Euler(0, 180, 0) * rot; //           << Workaround
      }
      if (target == null) {
        transform.localRotation = rot;
      } else {
        transform.rotation = target.rotation * rot;
      }
    }
    if (trackPosition) {
      Vector3 pos = Cardboard.SDK.HeadPose.Position;
      if (target == null) {
        transform.localPosition = pos;
      } else {
        transform.position = target.position + target.rotation * pos;
      }
    }
    if (OnHeadUpdated != null) {
      OnHeadUpdated(gameObject);
    }
  }

您只需添加:

headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0,0,180));

位于BaseCardboardDevice类的UpdateState((的和处。无论我如何打开我尝试过的设备,它都为我解决了这个问题。Unity 5硬纸板SDK v0.5.1

        var fixOrientation = Quaternion.identity;
        // Fix head pose based on device orientation (since native code assumes Landscape Left).
        switch (Input.deviceOrientation) {
        case DeviceOrientation.LandscapeLeft:
            fixOrientation = Quaternion.identity;
            break;
        case DeviceOrientation.LandscapeRight:
            fixOrientation = Quaternion.Euler(0, 0, 180);
            break;
        default:
            Debug.Log ("Error No Orientation" + Input.deviceOrientation.ToString ());
            break;
        }
        headPose.Set(headPose.Position, headPose.Orientation * fixOrientation);

现在,Cardboard SDK变成了GoogleVR,所以我在GvrDevice.cs 上这样写

让您的应用程序同时出现在LandscapeLeft和LandscapeRight中的一种方法是在Start方法中按以下顺序启用屏幕设置:

void Start () {
     Screen.orientation = ScreenOrientation.Landscape;
     Screen.orientation = ScreenOrientation.AutoRotation;
     Screen.autorotateToPortrait = false;
     Screen.autorotateToPortraitUpsideDown = false;
}

基本上,你强制一侧,然后启用自动旋转,然后防止旋转为纵向。

请注意,通过这种方式,您的应用程序可以在两个Landscape上工作,因此您只需要向左或向右旋转屏幕。

-

另请注意,这也适用于带有Cardboard的VR应用程序如任何其他。