立体视频设置在Unity中不起作用

时间:2017-06-15 21:37:06

标签: unity3d google-vr stereoscopy photosphere

我正在尝试使用photosphere查看(顶部)立体视频和GoogleVR(Daydream)的剔除蒙版技术,但它似乎没有按预期工作。这就是我所做的:

基本上我的场景有2个摄像头和2个相同位置的光球。我正在使用左侧相机的剔除遮罩元素来阻挡右侧球体,反之亦然右侧相机,因此左眼只能看到左侧球体和右侧球体,只能看到右侧球体。 “LeftSphere”正在播放视频的上半部分,“RightSphere”正在播放下半部分。因此,我应该看到立体感。

此外,由于我的场景启用了VR,因此两个摄像头上都有一个“目标眼”元素。我相应地设置了 - 左边是摄像头,右边是右边摄像头。

问题在于,当我在Unity中播放我的场景进行测试时,它只在两只眼睛上播放RightSphere,并且任何相机都看不到左侧球体。

以下是我发现的情况。我只是不知道如何修复它:

  • 当我在Unity中播放时,它会创建两个新的儿童摄像头(左眼和右眼,包含在图片中)。那些在Inspector中也有自己的“目标之眼”元素,但它们为LeftEye的两个子摄像头显示“Left”,并为RightEye的两个子摄像头显示“Right”。如果我改变那些“目标眼睛”以匹配正确的眼睛,它是有效的。但除非我处于播放模式,否则我无法编辑它们。一旦我退出播放模式,您就会恢复所做的任何更改。我如何访问这些儿童相机?那是问题吗?

(我正在使用UMP - UniversalMediaPlayer统一资产用于视频,顺便说一句)

我用我的Pixel在我的白日梦浏览器上试过它,它确实只是在玩monoscopic。

Child cameras appearing. Unable to edit them in "edit mode"

1 个答案:

答案 0 :(得分:0)

好吧,所以我终于开始工作了!如果将来有人遇到同样的问题,这就是你需要做的事情:

我正在使用Unity 2017.1.0b4和UniversalMediaPlayer作为我的视频播放器。 请注意,这仅适用于GoogleVR。

  1. 在播放器设置中启用VR
  2. 将GoogleVR资产导入Unity
  3. 在场景中放置“GvrViewerMain”预制件
  4. 复制相机并将两个相机坐标重置为零。我将我的相机命名为“LeftEye / RightEye”
  5. 创建一个Sphere并将coords重置为零,然后复制。我将它们命名为“LeftSphere / RightSphere”
  6. 创建两个新图层并将其命名为“LeftSphere”和“RightSphere”
  7. 在“LeftEye”相机剔除蒙版元素上,取消选中“RightSphere”。取消选中“RightEye相机”上的“LeftSphere”。
  8. 更改每个相机上的“目标眼”元素以对应正确的眼睛。
  9. 创建2个新材质,每个球体一个,然后在每个球体上拖动它们。
  10. 将两个球体的着色器更改为“UMP / VideoSphericalCanvas”(您需要来自资产商店的UMP) 编辑:忘记提及导入和设置您的UMP预制件并将两个球体拖动到它。超级简单的设置,顺便说一句。
  11. 在“LeftSphere”上将Tiling更改为X1 - Y0.5&偏移到X0 Y0
  12. 在“RightSphere”上将Tiling更改为X1 - Y0.5&偏移到X0 Y0.5
  13. 将图层从“默认”更改为“LeftSphere”(您之前创建的图层)在LeftSphere上,反之亦然,用于右侧球体。
  14. 这是导致我出问题的地方。因为每次加载或播放应用程序时都会创建新的相机,所以我必须找到一种方法来更改这4个相机的“剔除蒙版”和“目标之眼”。我发现如何做到这一点的唯一方法是通过脚本。

    1. 将此脚本附加到“LeftEye”和“RightEye”游戏对象中,您的检查器中将为左眼和右眼蒙版设置2个新的下拉菜单。相应地更改(与上述剔除面具相同)。
    2. GameObject left;
      Camera leftEye;
      
      GameObject right;
      Camera rightEye;
      
      public LayerMask LeftEyeMask;
      public LayerMask RightEyeMask;
      
      // Use this for initialization
      void Start () {
          left = GameObject.Find(gameObject.name + " Left");
          if (left != null) leftEye = left.GetComponent<Camera>();
      
          right = GameObject.Find(gameObject.name + " Right");
          if (right != null) rightEye = right.GetComponent<Camera>();
      }
      
      // Update is called once per frame
      void Update () {
      
          // LEFT EYE
          if (left == null)
          {
              left = GameObject.Find(gameObject.name + " Left");
              if (left != null)
                  leftEye = left.GetComponent<Camera>();
          }
          else
          {
              leftEye = left.GetComponent<Camera>();
              if (leftEye != null)
              {
                  leftEye.stereoTargetEye = StereoTargetEyeMask.Left;
                  leftEye.cullingMask = LeftEyeMask.value;
              }
          }
      
          // RIGHT EYE
          if (right == null)
          {
              right = GameObject.Find(gameObject.name + " Right");
              if (right != null)
                  rightEye = right.GetComponent<Camera>();
          }
          else
          {
              rightEye = right.GetComponent<Camera>();
              if (rightEye != null)
              {
                  rightEye.stereoTargetEye = StereoTargetEyeMask.Right;
                  rightEye.cullingMask = RightEyeMask;
              }
          }
      }
      

      您的上下视频现在应该在Daydream或Cardboard中以3D模式播放。