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已经达到 ...
随机推荐
- linux各种版本查看方法
1.linux内核版本 cat /proc/version Linux version 4.13.0-39-generic (buildd@lgw01-amd64-038) (gcc version ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...
- iOS-多线程(2)
多线程之NSOperation: 多线程的优点: 使用线程可以把占据时间长的程序中的任务呀放到后台去处理 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显 ...
- Spring配置SessionFactory
1.不用dataSource引入hibernate.cfg.xml <bean id="sessionFactory" class="org.springframe ...
- 处理登录和cookie
做法 1: 可以一步一步cookies,毫无疑问,这非常麻烦. import requests params = {'',''} r = requests.post('',params) r = re ...
- GC overhead limit exceeded,tomcat修改jvm内存
tomcat修改jvm内存 内存大小:-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Dja ...
- SharePoint 2013 SSO-Secure Store Service在实际案例中的应用
文章目录: Secure Store Service介绍 Secure Store Service部署 Secure Store Service应用 之前有一篇博客讲到使用EMSManagedAPI操 ...
- 【CF700B】Connecting Universities(贪心,树上最短路)
题意:给出一棵树上的2*k个节点,给他们配对,使得他们之间的距离和最大. 思路:一条边的两侧如果有一侧没有给定的节点就不会被经过…… 如果有1个节点就会被经过1次…… 如果两侧分别有x,y个给定节点就 ...
- AC日记——让我们异或吧 洛谷 P2420
题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...