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.
* "Ich habe zwei Kameras für das rechte und linke Auge mit jeweils einer Kugel um sie herum" * Ist das für VR? – Programmer
Ah ja, ich sollte es irgendwo erwähnen. Ich habe bisher nur Stereo erwähnt. – findusl
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