2017-03-24 5 views
2

Ich möchte ein Stereo-360-Grad-Video in der virtuellen Realität in Unity auf einem Android spielen. Bis jetzt habe ich einige Nachforschungen angestellt und ich habe zwei Kameras für das rechte und linke Auge mit jeweils einer Kugel um sie herum. Ich brauche auch einen benutzerdefinierten Shader, um das Bild auf der Innenseite der Kugel rendern zu lassen. Ich habe die obere Hälfte des Bildes auf einer Kugel, indem ich das y-tiling auf 0.5 und die untere Hälfte auf der anderen Kugel mit y-tiling 0.5 und y-offset 0.5 setze. Damit kann ich ein 3D 360 Grad Bild bereits korrekt anzeigen. Die ganze Idee stammt von this tutorial.Play 360 Stereoscopic Video mit VideoPlayer

Jetzt für Video, brauche ich Kontrolle über die Video-Geschwindigkeit so it turned out Ich brauche den VideoPlayer aus der neuen Unity 5.6 Beta. Nun würde mein Setup so weit reichen, dass der Video Player das Video auf beiden Sphären spielen würde, wobei eine Sphäre den oberen Teil (ein Auge) und das andere Video den unteren Teil (anderes Auge) spielen würde.

Hier ist mein Problem: Ich weiß nicht, wie man den Video Player das gleiche Video auf zwei verschiedenen Materialien (da sie unterschiedliche Tiling-Werte haben) zu spielen. Gibt es eine Möglichkeit, das zu tun?

Ich habe einen Hinweis, dass ich das gleiche Material verwenden und den Kacheleffekt über UV erzielen konnte, aber ich weiß nicht, wie das funktioniert und ich habe nicht einmal den Videoplayer, um das Video auf zwei Objekten zu spielen das gleiche Material auf beiden. Ich habe einen Screenshot of that here. Die rechte Kugel hat nur das Material videoMaterial. Keine Fliesen, da ich das über UV machen müsste.

Welcher Weg und wie geht das? Bin ich hier richtig?

+0

* "Ich habe zwei Kameras für das rechte und linke Auge mit jeweils einer Kugel um sie herum" * Ist das für VR? – Programmer

+0

Ah ja, ich sollte es irgendwo erwähnen. Ich habe bisher nur Stereo erwähnt. – findusl

+1

Dann Tag vr. Es sieht so aus, als ob Sie die Lösung in C# möchten. Warum nicht auch das markieren? Die Tags sind wichtig. Hab das nur für dich gemacht. – Programmer

Antwort

3

Bin ich auf dem richtigen Weg hier?

Fast, aber Sie sind zur Zeit Renderer und Material statt RenderTexture und Material verwenden.

Welcher Weg und wie geht das?

Sie müssen dafür RenderTexture verwenden. Im Grunde renderst du das Video auf RenderTexture, dann weist du diese Textur dem Material beider Sphären zu.

.Erstellen Sie eine RenderTexture und weisen Sie sie der VideoPlayer zu.

.Erstellen Sie zwei Materialien für die Kugeln.

.Set VideoPlayer.renderMode zu VideoRenderMode.RenderTexture;

.Set die Textur der beiden Kugeln um die Textur aus der RenderTexture

.Prepare und Video abspielen.

Der Code unten tut genau das. Es sollte aus der Box funktionieren. Das einzige, was Sie tun müssen, ist, die Kachelung und den Offset jedes Materials an Ihre Bedürfnisse anzupassen.

Sie sollten auch auf Kommentar:

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

dann eine Kugel aus jeder 3D-Anwendung importiert verwenden. Diese Codezeile dient nur zu Testzwecken und es ist keine gute Idee, ein Video mit der Sphäre von Unity abzuspielen, da die Sphären nicht genug Details haben, um das Video flüssig zu machen.

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

Es gibt auch Unity tutorial, wie dies mit einem speziellen Shader zu tun, aber das ist für mich nicht funktioniert und einige andere Leute. Ich schlage vor, dass Sie die oben beschriebene Methode verwenden, bis die VR-Unterstützung der API VideoPlayer hinzugefügt wird.