【问题标题】:Play 360 Stereoscopic video with VideoPlayer使用 VideoPlayer 播放 360 度立体视频
【发布时间】:2017-03-25 02:20:20
【问题描述】:

我想在 Android 上的 Unity 中在虚拟现实中播放立体 360 度视频。到目前为止,我一直在做一些研究,我有两个用于左右眼的摄像头,每个摄像头周围都有一个球体。我还需要一个自定义着色器来使图像呈现在球体内部。通过将 y 平铺设置为 0.5,我将图像的上半部分显示在一个球体上,下半部分显示在另一个球体上,y 平铺 0.5 和 y 偏移 0.5。 有了这个我可以展示一个已经正确的 3D 360 度图像。整个想法来自this tutorial

现在对于视频,我需要控制视频速度,所以it turned out 我需要新 Unity 5.6 beta 中的 VideoPlayer。现在,到目前为止,我的设置需要视频播放器在两个球体上播放视频,一个球体播放上半部分(一只眼睛),另一个视频播放下半部分(另一只眼睛)。

这是我的问题:我不知道如何让视频播放器在两种不同的材质上播放相同的视频(因为它们具有不同的平铺值)。有没有办法做到这一点?

我得到一个提示,我可以使用相同的材​​质并通过 UV 实现平铺效果,但我不知道它是如何工作的,我什至没有让视频播放器使用两者的材料相同。我有一个截图of that here。 Right 球体只有材料 videoMaterial。没有平铺,因为我必须通过紫外线来做到这一点。

走哪条路,怎么走?我在这里走对了吗?

【问题讨论】:

  • “我的左右眼有两个摄像头,每个摄像头周围都有一个球体”这是用于 VR 的吗?
  • 啊,是的,我应该在某处提到它。到目前为止我只提到了立体声。
  • 然后标记 vr。看起来您想要 C# 中的解决方案。为什么不也标记呢?标签很重要。刚刚为你做了。
  • 感谢您添加 vr 标签。我不需要 c# 中的解决方案。如果有人说我需要用另一种语言来做,我会这样做:)
  • Boo 在 Unity 中已停产,但我会尽力在其中提供解决方案。这是一种奇妙的语言。 VideoPlayer 仍然是新的并且处于测试阶段,仍然无法在一些 Android 设备上运行。 Unity 意识到了这一点,他们正在努力解决这个问题。慢慢来。

标签: c# video unity3d virtual-reality video-player


【解决方案1】:

我是不是走对了路?

几乎,但您目前使用的是RendererMaterial,而不是RenderTextureMaterial

走哪条路,怎么做?

您需要为此使用RenderTexture。基本上,您将视频渲染到RenderTexture,然后将该纹理分配给两个球体的材质。

1。创建一个RenderTexture 并将其分配给VideoPlayer

2.为球体创建两种材质。

3.将VideoPlayer.renderMode设置为VideoRenderMode.RenderTexture;

4.将两个球体的纹理设置为RenderTexture中的纹理

5.准备和播放视频。

下面的代码正在做同样的事情。它应该开箱即用。您唯一需要做的就是根据您的需要修改每种材质的平铺和偏移。

你也应该注释掉:

leftSphere = createSphere("LeftEye", new Vector3(-5f, 0f, 0f), new Vector3(4f, 4f, 4f));
rightSphere = createSphere("RightEye", new Vector3(5f, 0f, 0f), new Vector3(4f, 4f, 4f));

然后使用从任何 3D 应用程序导入的球体。该行代码仅用于测试目的,使用 Unity 球体播放视频并不是一个好主意,因为球体没有足够的细节来使视频流畅。

using UnityEngine;
using UnityEngine.Video;

public class StereoscopicVideoPlayer : MonoBehaviour
{
    RenderTexture renderTexture;

    Material leftSphereMat;
    Material rightSphereMat;

    public GameObject leftSphere;
    public GameObject rightSphere;

    private VideoPlayer videoPlayer;

    //Audio
    private AudioSource audioSource;

    void Start()
    {
        //Create Render Texture
        renderTexture = createRenderTexture();

        //Create Left and Right Sphere Materials
        leftSphereMat = createMaterial();
        rightSphereMat = createMaterial();

        //Create the Left and Right Sphere Spheres
        leftSphere = createSphere("LeftEye", new Vector3(-5f, 0f, 0f), new Vector3(4f, 4f, 4f));
        rightSphere = createSphere("RightEye", new Vector3(5f, 0f, 0f), new Vector3(4f, 4f, 4f));

        //Assign material to the Spheres
        leftSphere.GetComponent<MeshRenderer>().material = leftSphereMat;
        rightSphere.GetComponent<MeshRenderer>().material = rightSphereMat;

        //Add VideoPlayer to the GameObject
        videoPlayer = gameObject.AddComponent<VideoPlayer>();

        //Add AudioSource
        audioSource = gameObject.AddComponent<AudioSource>();

        //Disable Play on Awake for both Video and Audio
        videoPlayer.playOnAwake = false;
        audioSource.playOnAwake = false;

        // We want to play from url
        videoPlayer.source = VideoSource.Url;
        videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";

        //Set Audio Output to AudioSource
        videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

        //Assign the Audio from Video to AudioSource to be played
        videoPlayer.EnableAudioTrack(0, true);
        videoPlayer.SetTargetAudioSource(0, audioSource);

        //Set the mode of output to be RenderTexture
        videoPlayer.renderMode = VideoRenderMode.RenderTexture;

        //Set the RenderTexture to store the images to
        videoPlayer.targetTexture = renderTexture;

        //Set the Texture of both Spheres to the Texture from the RenderTexture
        assignTextureToSphere();

        //Prepare Video to prevent Buffering
        videoPlayer.Prepare();

        //Subscribe to prepareCompleted event
        videoPlayer.prepareCompleted += OnVideoPrepared;
    }


    RenderTexture createRenderTexture()
    {

        RenderTexture rd = new RenderTexture(1024, 1024, 16, RenderTextureFormat.ARGB32);
        rd.Create();
        return rd;
    }

    Material createMaterial()
    {
        return new Material(Shader.Find("Specular"));
    }

    void assignTextureToSphere()
    {
        //Set the Texture of both Spheres to the Texture from the RenderTexture
        leftSphereMat.mainTexture = renderTexture;
        rightSphereMat.mainTexture = renderTexture;
    }

    GameObject createSphere(string name, Vector3 spherePos, Vector3 sphereScale)
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = spherePos;
        sphere.transform.localScale = sphereScale;
        sphere.name = name;
        return sphere;
    }

    void OnVideoPrepared(VideoPlayer source)
    {
        Debug.Log("Done Preparing Video");

        //Play Video
        videoPlayer.Play();

        //Play Sound
        audioSource.Play();

        //Change Play Speed
        if (videoPlayer.canSetPlaybackSpeed)
        {
            videoPlayer.playbackSpeed = 1f;
        }
    }
}

还有Unity tutorial 介绍了如何使用特殊着色器进行此操作,但这对我和其他一些人不起作用。在VideoPlayer API 添加 VR 支持之前,我建议您使用上述方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多