首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity Cardboard Orientation横向颠倒

Unity Cardboard Orientation横向颠倒
EN

Stack Overflow用户
提问于 2015-08-25 17:15:13
回答 5查看 6.8K关注 0票数 3

嗨,我有一个使用google Cardboard SDK来启用立体视图的Unity应用程序,所以我将有一个支持VR的应用程序。我的应用程序运行得很好。

但是有一个问题,如果我将播放器设置方向设置为自动定向,只允许左横向和右横向。当它在风景左边时,一切正常工作,但当它在风景右边时,纸板视图将旋转180度(设置按钮移动到屏幕底部),但我的unity对象不会。因此,我有一个颠倒的对象。

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

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2015-09-02 12:11:13

SDK用来读取陀螺仪的原生代码似乎只针对横向左方向进行了硬编码。可以通过编辑BaseCardboardDevice.cs并将UpdateState()的定义替换为以下代码来解决此问题:

代码语言:javascript
复制
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设置中关闭Neck Model Scale (将其设置为0),因为它不会在此代码中正确显示。

票数 3
EN

Stack Overflow用户

发布于 2016-01-19 21:54:43

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

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

代码语言:javascript
复制
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()方法中应用旋转,代码如下:

代码语言:javascript
复制
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);
    }
  }
票数 2
EN

Stack Overflow用户

发布于 2015-09-08 01:36:37

您可以只添加以下内容:

代码语言:javascript
复制
headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0,0,180));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32200052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档