GOOGLE VR SDK开发VR游戏,VR播放器之一

最近一年来,VR虚拟现实和AR增强现实技术的宣传甚嚣尘上。其实VR,AR技术很早就有了,一直没有流行开来,不可否认价格是影响技术推广的最大壁垒。谷歌对VR最大的贡献是提供了廉价的谷歌眼镜,按照GOOGLE提供的图纸,使用两个放大镜和一个披萨盒就能轻松DIY出自己的VR眼镜,同一时期谷歌推出来开源的VR SDK,使得开发者可以轻松构建VR游戏和VR播放器,使得几乎所有对这一切感兴趣的公司可以轻松的低成本的在技术上布局VR产业链。很多VR眼镜已经降到了几十块钱,毫无疑问,谷歌又借着廉价和开源改变了我们的世界。

研究谷歌的SDK,需要具备一定的OPENGL知识,要不理解这一切十分困难。VR的原理十分简单,人能够感受的立体或者3D的世界全依赖人的双眼,人的双眼看到的东西是不一样,存在一个视角差,看一个立体的物体,左右眼能同时看到物体中间的部分,不过左眼能看到比右眼更多一点的左边部分,右眼能看到比左眼更多一点右边部分,大脑对两只眼镜看到的东西分析处理合成来感受这个世界的,一些3D画可以恰当的利于光线和颜色组合达到视觉欺骗也是这个原理。如果对OPENGL熟悉的话,应该很容易知道3D建模中,Camera的位置不同,能显示出来的对象角度是不一样的,特别是使用透视效果时,人的两眼就相当于3D世界里摄像头,两个摄像头看到的东西和一个是不同的。一般来说,独眼的残疾人如果不动的话,看到的世界是平面的,不过他们可以通过摆头或者移动身体来从不同的角度观察世界,从而在大脑里合成立体的世界。所以VR的原理就是把一张图片或者视频分解两个,分别提供给左右眼看,从而达到欺骗眼睛的效果,最终达到虚拟现实的效果。

谷歌VR SDK使用十分简单,一般来说最好下载最新的google VR sdk,VR SDK包括unity版本和java版本,两个版本功能差不多,一个用于unity平台,一个用于android平台,一个用于游戏开发,一个用于应用开发,当然这不是绝对,有不少应用也是使用unity开发,也有不少游戏使用java开发,选择上感觉可以看自己使用习惯。java版本包括两个包,一个cardboard.jar提借VR视觉支持,一个audio.jar提供VR声音支持。

CardboardActivity是VRSDK的主类,要使开发的窗口支持VR,窗口需要派生于这个类。可以根据需要调用CardBoardView,支持各种调用,完整代码如下,不过完成后除了看到一个按钮,其他都是黑冬冬的,因为Renderer我们没有填充内容,是个空的glsurface,熟悉opgengl的,可以完善这个类,后面会添加一个立方体用于测试眼镜
public class TestActivity extends CardboardActivity{
/*
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        RajawaliCardboardView cv = (RajawaliCardboardView) findViewById(R.id.view2);//new CardboardView(this);
        //cv.setRestoreGLStateEnabled(false);

        //cv.setRenderer(rd);

        this.setCardboardView(cv);

        RajawaliCardboardRenderer renderer = new RajawaliCardboardRenderer(this){
            @Override
            protected void initScene() {
                getCurrentScene().addChild(createSphereWithTexture(new Texture("photo", R.drawable.homepage)));

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

            @Override
            public void onNewFrame(HeadTransform headTransform) {
                super.onNewFrame(headTransform);
            }

            @Override
            protected void onRender(long ellapsedRealtime, double deltaTime) {
                super.onRender(ellapsedRealtime, deltaTime);
            }

            @Override
            public void onDrawEye(Eye eye) {
                super.onDrawEye(eye);
            }

            @Override
            public void onFinishFrame(Viewport viewport) {
                super.onFinishFrame(viewport);
            }

            @Override
            public void onSurfaceChanged(int width, int height) {
                super.onSurfaceChanged(width, height);
            }

            @Override
            public void onSurfaceCreated(EGLConfig config) {
                super.onSurfaceCreated(config);
            }

            @Override
            public void onRendererShutdown() {
                super.onRendererShutdown();
            }

            @Override
            public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
                super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
            }

            @Override
            public void onTouchEvent(MotionEvent event) {
                super.onTouchEvent(event);
            }
        };
        cv.setRenderer(renderer);
        cv.setSurfaceRenderer(renderer);

    }
*/
      /*
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);

        LinearLayout ln = new LinearLayout(this);
        ln.setBackgroundColor(Color.RED);

        CardboardView cbView = new CardboardView(this);

        cbView.setBackgroundColor(Color.BLUE);
        cbView.setVRModeEnabled(true);
        //cbView.setAlpha(0);
        cbView.setAlignmentMarkerEnabled(true);
        //cbView.setRenderer(new VrRenderer(this));

        VrRenderer renderer = new VrRenderer(this);
        cbView.setRenderer(renderer);

        cbView.setPreserveEGLContextOnPause(true);
        setContentView(cbView);

        cbView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                onCardboardTrigger();
            }
        });
        //mHideButtonsThread.start();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        CardboardView cardboardView = (CardboardView) findViewById(R.id.view2);
        cardboardView.setRenderer(rd);
        setCardboardView(cardboardView);

        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

        imageLeft = (ImageView) findViewById(R.id.image_left);
        imageRight = (ImageView) findViewById(R.id.image_right);
        progressLeft = (ProgressBar) findViewById(R.id.progress_left);
        progressRight = (ProgressBar) findViewById(R.id.progress_right);
        statusLeft = (TextView) findViewById(R.id.status_text_left);
        statusRight = (TextView) findViewById(R.id.status_text_right);

        fadeInAnim = new AlphaAnimation(0.0f, 1.0f);
        fadeInAnim.setDuration(500);

        setProgress(true);
        setStatus(true, getString(R.string.status_finding_files));

        // kick off our task to find all MPOs, which will in turn kick off showing the first one.
        new MpoFindTask().execute((Void) null);
    }
    */
    private Renderer rd = new Renderer(){

        @Override
        public void onDrawFrame(HeadTransform headTransform, Eye eye, Eye eye1) {

        }

        @Override
        public void onFinishFrame(Viewport viewport) {

        }

        @Override
        public void onSurfaceChanged(int i, int i1) {

        }

        @Override
        public void onSurfaceCreated(EGLConfig eglConfig) {

        }

        @Override
        public void onRendererShutdown() {

        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        CardboardView mSurfaceView = new CardboardView(this);

        addContentView(mSurfaceView, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));

        mSurfaceView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                | View.SYSTEM_UI_FLAG_IMMERSIVE);
        mSurfaceView.setRenderer(rd);
        mSurfaceView.setVRModeEnabled(true);
        //mSurfaceView.addChildrenForAccessibility();
        setCardboardView(mSurfaceView);
    }
}
参考:http://www.programcreek.com/java-api-examples/index.php?api=com.google.vrtoolkit.cardboard.CardboardView
时间: 2024-10-14 13:55:54

GOOGLE VR SDK开发VR游戏,VR播放器之一的相关文章

Android开发---MediaPlayer简单音乐播放器

Android开发-MediaPlayer简单音乐播放器 功能介绍 实现一个简单的播放器,类似网易云音乐形式,功能包括: 播放.暂停,停止,退出功能: 后台播放功能: 进度条显示播放进度.拖动进度条改变进度功能: 播放时图片旋转,显示当前播放时间功能: 界面样式 功能实现 1. MediaPlayer的实现 MediaPlayer常用方法介绍 MediaPlayer的实现包括初始化MediaPlayer,MediaPlayer的功能实现,包括播放.暂停.停止.离开等,具体细节如下: MediaP

GOOGLE VR SDK开发VR游戏,VR播放器之中的一个

近期一年来,VR虚拟现实和AR增强现实技术的宣传甚嚣尘上.事实上VR,AR技术非常早就有了,一直没有流行开来.不可否认价格是影响技术推广的最大壁垒. 谷歌对VR最大的贡献是提供了便宜的谷歌眼镜,依照GOOGLE提供的图纸,使用两个放大镜和一个披萨盒就能轻松DIY出自己的VR眼镜,同一时期谷歌推出来开源的VR SDK,使得开发人员能够轻松构建VR游戏和VR播放器,使得差点儿全部对这一切感兴趣的公司能够轻松的低成本的在技术上布局VR产业链. 非常多VR眼镜已经降到了几十块钱.毫无疑问,谷歌又借着便宜

记一次酷狗音乐API的获取,感兴趣的可以自己封装开发自己的音乐播放器

1.本教程仅供个人学习用,禁止用于任何的商业和非法用途,如涉及版权问题请联系笔者删除. 2.随笔系作者原创文档,转载请注明文档来源:http://www.cnblogs.com/apresunday/p/8448126.html,谢谢 小八这几天正在学习微信小程序的开发,于是想在学的同时能开发出来一个关于音乐的项目,但是问题在于音乐这东西.一方面是数据量太大,第二个方面就是牵扯到很多的版权的问题,所以笔者就想着借助于目前市面上的音乐播放器上的音乐文件,鉴于酷狗音乐上边的歌多而且比较的全面,在此就

微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器

我的微信开发者工具 开篇语 好不容易,终于把所有的基础课程全部看完了!昨天,我很高兴地开始了看别人做的项目进行深度的学习.其实也说不上是项目吧,更多的像是一种给新手看的示例代码.然后我在这些代码上面进行我自己的改进.最后也就有了接下来我会给大家带来的这篇文章中的项目.这个项目是完整的,它包括了一个原本的示例代码中带着的莫名其妙的动画组件(可能是为了更多额展示微信小程序的控件体系)以及跑步的组件,还有我后来自己加上去的一个音乐播放组件.总共也就有了三个的功能:动画效果展示:跑步的定时以及定位功能:

IOS开发之简单音频播放器

今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易的音频播放器,来犒劳一下自己这一天的UI学习成果.在用到UI的控件时如果很好的理解之前博客在OC中的Target-Action回调模式,感觉控件的用法会很顺手.下面的简易播放器没有用到多高深的技术,只是一些基本控件和View的使用. 话不多说简单的介绍一下今天的音频播放器.在播放器中我们用到了UIP

ios开发:一个音乐播放器的设计与实现

github地址:https://github.com/wzpziyi1/MusicPlauer 这个medo,关于歌曲播放的主要功能都实现了的.下一曲.上一曲,暂停,根据歌曲的播放进度动态滚动歌词,将当前正在播放的歌词放大显示,拖动进度条,歌曲跟着变化,并且使用Time Profiler进行了优化,还使用XCTest对几个主要的类进行了单元测试. 已经经过真机调试,在真机上可以后台播放音乐,并且锁屏时,显示一些主要的歌曲信息. 首页: 歌曲内部播放: 当拖动小的进度条的时候,歌曲也会随之变化.

iso 开发学习--简易音乐播放器(基于iPhone4s屏幕尺寸)

三个按钮  一个进度条 贴图(软件中部分图片,来自网络,如果侵犯了您的权益,请联系我,会立刻撤下) 核心代码 // // ViewController.m // 08-10-MusicPlayer // // Created by Ibokan on 15/8/10. // Copyright (c) 2015年 Crazy凡. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVF

在 Oculus和 Gear VR上开发跨平台的 VR应用

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:cartzhang 说明:本文同步发于蛮牛论坛.http://www.manew.com/thread-89068-1-1.html?_dsign=09548ffa ** 我花了两个月时间开发了一款针对PC(Oculus头盔)和移动端(三星GearVR)的虚拟现实应用.使 用unity5版本,Oculus

Google Android SDK开发范例------------20141119

一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox.setOnClickedChangeListener( new CheckBox.OnClickedChangeListener() { public void onCheckedChanged(CompoundButton arg0, boolean arg1){  if(checkbox.is