如何通过Google CardBoard Android SDK和Rajawali制作简单的VR视频播放器 [英] How to make a simple VR video player by Google CardBoard Android SDK and Rajawali

查看:185
本文介绍了如何通过Google CardBoard Android SDK和Rajawali制作简单的VR视频播放器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是这些领域的新人.我正在尝试在github中更改一个程序来播放硬纸板视频.

I am a new man in these area. I am trying to change a program in github to play video for cardboard now.

我使用StreamingTexture修改了MyRenderer.

I modified the MyRenderer by using StreamingTexture.

public class MyRenderer extends RajawaliCardboardRenderer {

public MyRenderer(Context context) {
    super(context);
}

private MediaPlayer mMediaPlayer;
private StreamingTexture streamingTexture;

@Override
protected void initScene() {
    mMediaPlayer = MediaPlayer.create(this.getContext(), R.raw.test);

    streamingTexture = new StreamingTexture("video", mMediaPlayer);
    Sphere sphere = createPhotoSphereWithTexture(streamingTexture);

    getCurrentScene().addChild(sphere);

    getCurrentCamera().setPosition(Vector3.ZERO);
    getCurrentCamera().setFieldOfView(75);
}

private static Sphere createPhotoSphereWithTexture(ATexture texture) {

    Material material = new Material();
    material.setColor(0);

    try {
        material.addTexture(texture);
    } catch (ATexture.TextureException e) {
        throw new RuntimeException(e);
    }

    Sphere sphere = new Sphere(50, 64, 32);
    sphere.setScaleX(-1);
    sphere.setMaterial(material);

    return sphere;
}
}

我将我的短视频保存为原始文件夹中的test.mp4,但是,在启动我的应用程序之后,两边都是空白,并且视频的声音实际上正在播放.

I saved my short video as test.mp4 in the raw folder, however , after I start my app the two sides are blank, and the video's sound is actually playing.

我需要一些帮助.非常感谢你!

I need some help. Thank you very much!

推荐答案

我在这样工作的纸板上获得了360度带有头部跟踪的视频.

I got 360 video with head tracking in a carboard working like this.

使用 RajawaliVRRenderer

public class YoureVideoClass extends RajawaliVRRenderer {

接下来使用以下initScene():

next use the following initScene():

    @Override
public void initScene() {

    // setup sphere
    Sphere sphere = new Sphere(1, 100, 100);
    sphere.setPosition(0, 0, 0);
    // invert the sphere normals
    // factor "1" is two small and result in rendering glitches
    sphere.setScaleX(100);
    sphere.setScaleY(100);
    sphere.setScaleZ(-100);

    //initiate MediaPlayer
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setLooping(true);
    try {
        Uri videoUrl = Uri.parse("android.resource://" + getContext().getPackageName() + "/"
                + R.raw.test);
        mediaPlayer.setDataSource(getContext(),Uri.parse(videoUrl));
        mediaPlayer.prepareAsync();    //prepare the player (asynchronous)
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start(); //start the player only when it is prepared
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }

    // create texture from media player video
    videoTexture = new StreamingTexture("video", mediaPlayer);

    // set material with video texture
    Material material = new Material();
    material.setColorInfluence(0f);
    try {
        material.addTexture(videoTexture);
    } catch (ATexture.TextureException e){
        throw new RuntimeException(e);
    }
    sphere.setMaterial(material);

    // add sphere to scene
    getCurrentScene().addChild(sphere);

    super.initScene();
}

启动场景后,您想在每个渲染器上更新videoTexture,因此添加:

After initiating the scene you want to update the videoTexture on every render, so add:

@Override
public void onRender(long elapsedRealTime, double deltaTime) {
    super.onRender(elapsedRealTime, deltaTime);

    if (videoTexture != null) {
        // update texture from video content
        videoTexture.update();
    }
}

最后但并非最不重要的一点是,您想像这样更新相机以进行纸板的运动跟踪:

And last but not least you want to update the camera for movement tracking for the cardboard like this:

@Override
public void onDrawEye(Eye eye) {
    // Rajawali camera
    org.rajawali3d.cameras.Camera currentCamera = getCurrentCamera();

    // cardboard field of view
    FieldOfView fov = eye.getFov();

    // update Rajawali camera from cardboard sdk
    currentCamera.updatePerspective(fov.getLeft(), fov.getRight(), fov.getBottom(), fov.getTop());
    eyeMatrix.setAll(eye.getEyeView());
    // orientation
    eyeOrientation.fromMatrix(eyeMatrix);
    currentCamera.setOrientation(eyeOrientation);
    // position
    eyePosition = eyeMatrix.getTranslation().inverse();
    currentCamera.setPosition(eyePosition);

    // render with Rajawali
    super.onRenderFrame(null);
}

此外,要将其他一些侦听器传递到carboard sdk,您将需要以下功能:

Also, to pass some other listeners forward to the carboard sdk you will need these functions:

@Override
public void onSurfaceChanged(int width, int height) {
    // tell Rajawali that cardboard sdk detected a size change
    super.onRenderSurfaceSizeChanged(null, width, height);
}

@Override
public void onSurfaceCreated(EGLConfig eglConfig) {
    // pass opengl config to Rajawali
    super.onRenderSurfaceCreated(eglConfig, null, -1, -1);
}

@Override
public void onRenderSurfaceDestroyed(SurfaceTexture surface) {
    super.onRenderSurfaceDestroyed(surface);
}

这篇关于如何通过Google CardBoard Android SDK和Rajawali制作简单的VR视频播放器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆