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
GOOGLE VR SDK开发VR游戏,VR播放器之中的一个的更多相关文章
- (HLS播放器之中的一个)HLS协议之M3U8解析
參照 http://tools.ietf.org/html/draft-pantos-http-live-streaming-08, 能够对M3U8有比較系统的认识. HLS(HTTP Live St ...
- C#开发Unity游戏教程之Unity中方法的参数
C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...
- 继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题
关于讯飞语音SDK开发学习 使用vs自带打包,具体怎么操作就不说了,网上关于这方面的资料挺多的.例如:winform 打包部署,VS2010程序打包操作(超详细的),关键是桌面上创建快捷方式中的&qu ...
- 在 Oculus和 Gear VR上开发跨平台的 VR应用
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:car ...
- Google Android SDK开发范例大全笔记 二
网络设备管理相关相关 代码地址 1 WifiManager LocationManager分别控制 wifi及GPS WifiManager 判断网络状态 ,LocationManager判断定位状态 ...
- Google Android SDK开发范例------------20141119
一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...
- Google Android SDK开发范例大全笔记 一
方法讲解 1 获取手机分辨率方法 DisplayMetrics private void getDiaplayMetrics() { DisplayMetrics dm = new DisplayMe ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
- 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...
随机推荐
- [python篇] [伯乐在线][1]永远别写for循环
首先,让我们退一步看看在写一个for循环背后的直觉是什么: 1.遍历一个序列提取出一些信息 2.从当前的序列中生成另外的序列 3.写for循环已经是我的第二天性了,因为我是一个程序员 幸运的是,Pyt ...
- bootstrap 中dropmenu不起作用
今天在使用bootstrap发现dropmenu一直不起作用,代码是从官网拷贝过来. 网上查找可以用的页面进行一点点的去除分析,发现竟然是顺序反了导致的. 在使用dropmenu时需要引入jquery ...
- 通过设置chrome浏览器解决跨域问题,在本地进行开发工作
后端跨域权限无法打开,于是去网上找了下我这边能不能解决 现在的浏览器出于安全策略的限制,都是不允许跨域的,但是开发的时候经常需要一些别的域的接口,特别是一些接口不是自己能控制的时候,往往会造成开发困难 ...
- bzoj 4007 树形dp
题目大意 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种关系刚好组成一个 n 层的完全二叉树.公民 i 的下属是 2 * i 和 2 * i +1.最下层的公民即叶子节 ...
- uva 11732 (trie树)
题意:求N个字符串两两比较,共比较了多少次? #include<iostream> #include<cstring> #include<cstdio> using ...
- Linux System Programming 学习笔记(一) 介绍
1. Linux系统编程的三大基石:系统调用.C语言库.C编译器 系统调用:内核向用户级程序提供服务的唯一接口.在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间 用户程序通过寄 ...
- spring和resteasy 的集成方式
spring和resteasy集成,三种主要的方式, 对于和jboss as7的集成不需要做任何工作,jboss默认集成了resteasy,只需要对业务pojo做一些jax-rs的注解标注即可.这里讲 ...
- 【CF1016B】Segment Occurrences(模拟)
题意:给定两个串s和t,多次询问s的一个区间[l ,r]中有多少个子串与t串相同 len<=1e3,q<=1e5 思路:前缀和 #include<cstdio> #includ ...
- js判断鼠标滑轮滚动方向并根据滚动的方向触发不同的事件
<script> var scrollFunc = function (e) { var direct = 0; e = e || window.event; if (e.wheelDel ...
- Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))
2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...