Ориентация Unity Cardboard Альбомная Справа Перевернутая

Привет, у меня есть приложение Unity, которое использует Google Cardboard SDK для включения стереоскопического просмотра, поэтому у меня будет приложение с поддержкой VR. Мое приложение работает отлично.

Но есть проблема, если я устанавливаю ориентацию настроек плеера на автоматическую ориентацию, разрешая только альбомную ориентацию слева и альбомную справа. Когда он находится в альбомной ориентации слева, все работает как обычно, но когда он находится в альбомной ориентации справа, вид картона повернется на 180 градусов (кнопка настроек перемещена в нижнюю часть экрана), а мои объекты единства - нет. Таким образом, у меня есть перевернутые объекты.

Любой способ исправить это?

Спасибо.


person CodingBird    schedule 25.08.2015    source источник


Ответы (5)


Похоже, что собственный код, который 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);
}

Я также предлагаю отключить Масштаб модели шеи (установите его на 0) в настройках картона, так как с этим кодом это не получится.

person smd    schedule 02.09.2015

Я решил эту проблему, вот решение (действительно для 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);
    }
  }
person Anton Kryvenko    schedule 19.01.2016

Вы можете просто добавить:

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

в и UpdateState() класса BaseCardboardDevice. Это решило эту проблему для меня независимо от того, как я включал устройства, на которых пробовал. Картонный SDK для Unity 5 v0.5.1

person KwahuNashoba    schedule 07.09.2015

        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

person peroon    schedule 05.07.2016

Один из способов, позволяющих вашему приложению отображаться как в LandscapeLeft, так и в LandscapeRight, не привязываясь только к одному, заключается в методе Start для включения параметров экрана в следующей последовательности:

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

В основном вы форсируете одну сторону, затем включаете автоматическое вращение, а затем предотвращаете вращение портретом.

Обратите внимание, что таким образом ваше приложение может работать в обоих ландшафтах, поэтому вам нужно только поворачивать экран влево или вправо.

-

Также обратите внимание, что это также работает для одного VR-приложения с Cardboard, как и для любого другого.

person Erick Simões    schedule 04.11.2017