0

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

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

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

问题是当我在 Unity 中播放我的场景来测试它时,它只在双眼上播放 RightSphere,而左侧的球体没有被任何相机看到。

这是我发现正在发生的事情。我只是不知道如何解决它:

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

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

我已经用我的 Pixel 在我的 Daydream 查看器上进行了尝试,它确实只是在播放单视场。

出现儿童摄像机。 无法编辑它们

4

1 回答 1

0

好的,所以我终于让它工作了!如果将来有人遇到同样的问题,您需要执行以下操作:

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

  1. 在播放器设置中启用 VR
  2. 将 GoogleVR 资产导入 Unity
  3. 在场景中放置“GvrViewerMain”预制件
  4. 复制相机并将两个相机坐标重置为零。我将相机命名为“LeftEye/RightEye”
  5. 创建一个球体并将坐标也重置为零,然后复制。我将它们命名为“LeftSphere/RightSphere”
  6. 创建两个新图层并将它们命名为“LeftSphere”和“RightSphere”
  7. 在“LeftEye”相机剔除蒙版元素上,取消选中“RightSphere”。取消选中“RightEye 相机”上的“LeftSphere”。
  8. 更改每个相机上的“目标眼睛”元素以对应正确的眼睛。
  9. 创建 2 个新材料,每个球体一个,然后将它们拖到每个球体上。
  10. 将两个球体的着色器更改为“UMP/VideoSphericalCanvas”(您需要资产商店中的 UMP) 编辑:忘记提及导入和设置您的 UMP 预制件并将两个球体拖到其中。超级容易设置,顺便说一句。
  11. 在“LeftSphere”上,将 Tiling 更改为 X1 - Y0.5 & Offset 为 X0 Y0
  12. 在“RightSphere”上,将 Tiling 更改为 X1 - Y0.5 & Offset 更改为 X0 Y0.5
  13. 在 LeftSphere 上将图层从“默认”更改为“LeftSphere”(您之前创建的图层),反之亦然。

这就是它给我带来问题的地方。因为每次加载或播放应用程序时都会创建新的相机,所以我必须找到一种方法来更改这 4 个相机的“Culling Mask”和“Target Eye”。我发现如何做到这一点的唯一方法是通过脚本。

  1. 将此脚本附加到您的“LeftEye”和“RightEye”游戏对象,您的检查器中将有 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;
        }
    }
}

您的 Top-Bottom 视频现在应该可以在 Daydream 或 Cardboard 中以 3D 播放。

于 2017-06-16T20:22:04.793 回答