c# - لعب 360 فيديو مجسمة مع فيدوبلاير



video unity3d (1)

أنا على الطريق الصحيح هنا؟

تقريبا ولكن كنت تستخدم حاليا Renderer Material بدلا من RenderTexture Material .

ما هي الطريقة للذهاب وكيفية القيام بذلك؟

تحتاج إلى استخدام RenderTexture لهذا الغرض. في الأساس، يمكنك تقديم الفيديو إلى RenderTexture ثم قمت بتعيين هذا الملمس إلى المواد من كلا المجالين.

1. إنشاء RenderTexture إلى RenderTexture .

2. إنشاء اثنين من المواد في المجالات.

3 .Set 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));

ثم استخدم سفير مستورد من أي تطبيق ثلاثي الأبعاد. هذا الخط من التعليمات البرمجية هو فقط هناك لأغراض الاختبار وليس من الجيد أن تلعب الفيديو مع المجال يونتي لأن المجالات لا يملك ما يكفي من التفاصيل لجعل الفيديو على نحو سلس.

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;
        }
    }
}

هناك أيضا الوحدة التعليمية البرنامج على كيفية القيام بذلك مع تظليل خاص ولكن هذا لا يعمل بالنسبة لي وبعض الناس الآخرين. أقترح عليك استخدام الأسلوب أعلاه حتى يتم إضافة دعم فر إلى واجهة برمجة التطبيقات VideoPlayer .

أريد أن ألعب ستيريو 360 درجة الفيديو في الواقع الافتراضي في الوحدة على الروبوت. حتى الآن لقد تم القيام ببعض البحوث ولدي اثنين من الكاميرات للعين اليمنى واليسرى مع كل مجال من حولهم. أنا أيضا بحاجة إلى تظليل مخصص لجعل الصورة تجعل على داخل المجال. لدي النصف العلوي من الصورة تظهر على مجال واحد عن طريق وضع y-- البلاط إلى 0.5 و النصف السفلي يظهر على المجال الآخر مع y-- تبليط 0.5 و y-- تعويض 0.5. مع هذا يمكن أن تظهر صورة 3D 360 درجة صحيحة بالفعل . الفكرة كلها من هذا البرنامج التعليمي .

الآن للفيديو، ولست بحاجة السيطرة على سرعة الفيديو لذلك اتضح أنني بحاجة إلى فيدوبلاير من الوحدة الجديدة 5.6 بيتا. الآن الإعداد بلدي حتى الآن يتطلب مشغل الفيديو لتشغيل الفيديو على كلا المجالين مع كرة واحدة لعب الجزء العلوي (عين واحدة) والفيديو الآخر يلعب الجزء السفلي (العين الأخرى).

وهنا هي مشكلتي : أنا لا أعرف كيفية الحصول على لاعب الفيديو لتشغيل نفس الفيديو على اثنين من مواد مختلفة (لأن لديهم قيم تبليط مختلفة). هل من طريقة لانجاز ذلك؟

حصلت على تلميح بأنني أستطيع استخدام نفس المادة وتحقيق تأثير التبليط عبر الأشعة فوق البنفسجية، ولكن أنا لا أعرف كيف يعمل ولم أكن حتى حصلت على مشغل الفيديو لتشغيل الفيديو على كائنين باستخدام نفس المادة على كلاهما. لدي لقطة من هنا . المجال الصحيح لديه فقط فيديوماتريال المواد. لا تبليط منذ كنت قد فعلت ذلك عبر الأشعة فوق البنفسجية.

ما هي الطريقة للذهاب وكيفية القيام بذلك؟ أنا على الطريق الصحيح هنا؟