近期一年来,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播放器之中的一个的更多相关文章

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

    參照 http://tools.ietf.org/html/draft-pantos-http-live-streaming-08, 能够对M3U8有比較系统的认识. HLS(HTTP Live St ...

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

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...

  3. 继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题

    关于讯飞语音SDK开发学习 使用vs自带打包,具体怎么操作就不说了,网上关于这方面的资料挺多的.例如:winform 打包部署,VS2010程序打包操作(超详细的),关键是桌面上创建快捷方式中的&qu ...

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

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:car ...

  5. Google Android SDK开发范例大全笔记 二

    网络设备管理相关相关 代码地址 1 WifiManager LocationManager分别控制 wifi及GPS WifiManager 判断网络状态 ,LocationManager判断定位状态 ...

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

    一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...

  7. Google Android SDK开发范例大全笔记 一

    方法讲解 1 获取手机分辨率方法 DisplayMetrics private void getDiaplayMetrics() { DisplayMetrics dm = new DisplayMe ...

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

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

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

    微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...

随机推荐

  1. hiho[Offer收割]编程练习赛30

    题目1 : 提取用户名 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在现在的各种互联网应用中,在一段文字中使用'@'字符来提起一名用户是流行的做法. 例如: &quo ...

  2. 2018"百度之星"程序设计大赛 - 资格赛

    调查问卷  Accepts: 1546  Submissions: 6596  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144 ...

  3. C遇到的编译错误整理

    1: Permission denied collect2.exe: error: ld returned exit status c:/mingw/bin/../lib/gcc/mingw32/6. ...

  4. php hash防止表单

    <?php /** * Created by PhpStorm. * User: brady * Desc: * Date: 2017/7/12 * Time: 15:01 */class te ...

  5. 【Luogu】P2536病毒检测(Trie上DP)

    题目链接 这道题我写了个01DP,f[i][j]表示跑到Trie上第i个节点,匹配到字符串第j位行不行 然后重点在*号无限匹配怎么处理 经过一番脑洞我们可以发现*号无限匹配可以拆成两种情况: 1:匹配 ...

  6. chromedriver对应的支持的Chrome版本(更新至Chrome64)

    很多网友在配置chromedriver的时候会遇到很多麻烦,在网上找了很多资料觉得这个表格不错,就给大家分享出来,希望对大家配置chrome的时候有帮助: chromedriver版本 支持的Chro ...

  7. 瞄一眼CopyOnWriteArrayList(jdk11)

    CopyOnWriteArrayList是ArrayList线程安全的变体.使用写时复制策略进行修改操作. 与之前版本较明显的区别是,jdk11中用来保护所有设值方法(mutator)的Reentra ...

  8. TroubleShoot:The context has expired (0×80090317)

    网上搜了一下,服务器上的时间不正确,在SharePoint 设置中,可以通过管理中心设置下Time Zone 和服务器的时间上一致.

  9. 【CF711C】Coloring Trees(DP)

    题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...

  10. LeetCode OJ--Median of Two Sorted Arrays ***

    http://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 找两个有序数组的中位数,因为有序数组,并且复杂度要求O(lg(m+n))所以想 ...