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熟悉的话,应该非常easy知道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,支持各种调用,完整代码例如以下,只是完毕后除了看到一个button,其它都是黑冬冬的,由于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-11-10 10:01:18

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

(HLS播放器之中的一个)HLS协议之M3U8解析

參照 http://tools.ietf.org/html/draft-pantos-http-live-streaming-08, 能够对M3U8有比較系统的认识. HLS(HTTP Live Streaming)是苹果公司针对iPhone.iPod.iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方式.在 HLS 技术中 Web server向client提供接近实时的音视频流.但在使用的过程中是使用的标准的 HTTP 协议,所以这时,仅仅要使用 HLS 的技术,就能在普

C#开发Unity游戏教程之Unity中方法的参数

C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别方法的作用吧.既然C#的语法规定方法就应该这么写,肯定是有一定道理的.如果是上升到战略意义的道理,连作者也不是很明白,但是作者知道这对括号里可以添加“参数”. Unity中参数的作用 要说明参数的作用,就必须从方法说起.方法可以处理变量中的数据,进而影响游戏对象的行为逻辑,这是本章前面一直在强调的.

用cocos2d-android开发android游戏时调用box2d中的native本地函数问题

用cocos2d-android开发android游戏时调用box2d中的new World(Vector2,boolean)时,出现如下报错: "java.lang.UnsatisfiedLinkError: Native method not found: com.badlogic.gdx.physics.box2d.World.newWorld:(FFZ)J" 解决方法: 在当前类中添加代码: static { System.loadLibrary("gdx"

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

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

在 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

微信公众号开发 柳峰老师聊天实例中的一个问题 部署不成功

实例中有一个chat(聊天)功能,在CoreServlet.java中的init函数中,引入了ChatService,在该文件中,引入MySQLUtil.java文件.MySQLUtil.java有对数据库的操作,由于数据库配置在本机,不是在BAE中,所以,部署后,执行微信用户号测试,点击该公众号没反应.覆盖掉init函数部分部署后正常. //CoreServlet.java @Override public void init() throws ServletException { File

【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://github.com/JeffreySu/WeiXinMPSDK 微信技术交流社区:http://www.weiweihi.com/QA Senparc

微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://github.com/JeffreySu/WeiXinMPSDK 微信技术交流社区:http://www.weiweihi.com/QA Senparc.Weixin.MP SDK的目标是探索微信公众平台更好的SDK模式,并提