Android 虚拟现实(virtual reality)入门指南
入门指南
本文档介绍怎样使用实验性的 Cardboard SDK for Android 创建您自己的虚拟实境 (VR) 体验。
Android 演示版应用:Treasure Hunt
本教程中的代码演示样例摘自“Treasure Hunt”Android 演示版应用。
Cardboard 是一个简单的设备。可让智能手机发挥虚拟实境平台的威力。 Cardboard 可与手机配合使用。从而在双眼中呈现三维场景、跟踪响应头部移动以及通过磁铁输入与应用进行交互。
演示版应用“Treasure Hunt”可展示上述功能。 在此游戏中,用户在数字化的世界里四处观望。目的是尽快寻找和搜集物品。 这是一款很主要的游戏,但它展示了 Cardboard 的核心功能。
游戏特性
“Treasure Hunt”一开场是以三维立体文字呈现的游戏说明。
当用户发现物品后,系统会指示用户拉动磁铁。
这就是屏幕上显示的内容。 在 Cardboard 中观看时,这些将以三维场景呈现。
当用户在屏幕中间的中心位置发现立方体时。立方体通过将其颜色更改为黄色进行指示。
用户在立方体变为黄色时拉动磁铁,用户的得分就会添加,随后立方体将移动到新的位置。
此应用使用OpenGL ES 2.0 显示物品。 它演示了一些主要的功能,如灯光、在空间的移动和着色。 展示了怎样使用磁铁作为输入、怎样知道用户是否正在看某样东西,以及怎样通过为每仅仅眼睛提供不同的视图来呈现图像。
这里写图片描写叙述
这里写图片描写叙述
如今。我们看下怎样构建演示版应用。并在手机上执行它。
打开并执行 Treasure Hunt
開始前的准备工作
构建演示版应用须要:
Android Studio 1.0 或更高版本号
Android SDK 19 版本号
执行 Android 16 (Jelly Bean) 或更高版本号的 Android 物理设备
下载演示样例代码
通过执行下面命令。从cardboard-java GitHub 存储库克隆演示版应用
git clone https://github.com/googlesamples/cardboard-java.git
构建演示版应用
1.打开 Android Studio。在 Welcome 页面上,选择Import Non-Android Studio Project。
选择位于您刚下载的演示样例代码文件根目录处的 build.gradle 文件,然后点击 OK。
这会在编辑器视图中打开一个名为 CardboardSample 的项目,其包括我们上面介绍的 Treasure Hunt 演示样例应用。
2.将手机连接到装置上,点击Run。然后执行“CardboardSample”以在手机上编译和执行应用。
代码概览
manifest文件
Cardboard SDK 须要下面manifest文件标签:
<manifest ...
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
...
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19"/>
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<application
...
<activity
android:name=".MainActivity"
android:screenOrientation="landscape">
...
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="com.google.intent.category.CARDBOARD" />
</intent-filter>
</activity>
</application>
</manifest>
请注意下面事项:
· 表示设备必须执行 API 级别 16 (Jellybean)
或更高版本号。
· 表示应用针对的是 API 级别 19 (KitKat)。
· 表示设备必须支 持 OpenGL ES 2.0 才干执行演示版应用。
· android:screenOrientation=”landscape” 表示 Activity 要求屏幕方向为”横向。” 您必须将 VR 应用的方向设为横向。
Cardboard SDK 使用的视图、 CardboardView 仅仅能在全屏和横向(landscape、
reverseLandscape、sensorLandscape)模式下呈现。
另外,推荐使用设置 android:configChanges=”orientation|keyboardHidden”。但并不强制。
· Cardboard SDK 须要具有 android.permission.NFC 权限才干訪问 Cardboard 的 NFC 标签。
· android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WRITE_EXTERNAL_STORAGE。 Cardboard SDK
须要具有这些权限才干将用户的手机和他们的 VR 查看器进行配对。
· 演示版应用须要具有 android.permission.VIBRATE 权限才干使手机发生震动。以通知用户发生了一些事。
· intent-filter,特别是 com.google.intent.category.CARDBOARD。声明此 Activity 与类似 Cardboard 的查看器兼容。 Cardboard 应用使用此类别列出用户手机上安装的兼容应用
扩展 CardboardActivity
CardboardActivity 是对 Cardboard 应用进行编码的起点。 CardboardActivity 是一个基础 Activity,可与 Cardboard 设备轻松集成。
它将事件公开,以便与 Cardboard 进行交互。并处理为 VR 呈现创建 Activity 时通常要求的众多细节。
请注意,CardboardActivity 使用粘滞的沉浸模式,在该模式下。系统 UI 处于隐藏状态,且内容会占用整个屏幕。 这是对 VR 应用的一项要求,原因是 CardboardView 仅在 Activity 处于全屏模式时才会呈现。
有关此功能的很多其它讨论。请參见使用沉浸式全屏模式。
演示版应用的 MainActivity 可扩展 CardboardActivity。 MainActivity 可实现下面界面:
CardboardView.StereoRenderer:渲染器界面,将全部立体影像渲染细节分配到视图。
实现者在渲染视图时,採用的方式应与以往一样(使用提供的变换參数)。 全部的立体影像呈现和失真校正细节都是从渲染器提取的。并通过视图在内部管理。
定义 CardboardView
Android 应用中的全部用户界面元素都是使用视图构建的。
Cardboard SDK for Android 可提供自己的视图CardboardView,这是GLSurfaceView的简单扩展,可用于 VR 呈现。 CardboardView 使内容呈现出立体感。 您能够查看演示版应用怎样通过下面方式将 CardboardView 定义到其 Activity 布局 xml 文件里:
<com.google.vrtoolkit.cardboard.CardboardView
android:id="@+id/cardboard_view
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
然后。它在主 Activity 类中初始化 CardboardView(以 onCreate() 方法):
**
* Sets the view to our CardboardView and initializes the transformation matrices we will use
* to render our scene.
* @param savedInstanceState
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.common_ui);
CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view);
// Associate a CardboardView.StereoRenderer with cardboardView.
cardboardView.setRenderer(this);
// Associate the cardboardView with this activity.
setCardboardView(cardboardView);
// Initialize other objects here.
...
}
呈现视图
在获得 CardboardView 后。将其与渲染器关联。然后将 CardboardView 与 Activity 进行关联。 Cardboard 支持两类渲染器,但入门的最快方式是使用 CardboardView.StereoRenderer,这是演示版本号应用使用的内容。
CardboardView.StereoRenderer 包括下面两个关键方法:
onNewFrame(),应用每次进行渲染时调用。
onDrawEye(),针对眼睛參数不同的每仅仅眼睛进行调用。
实现这些的方法与针对 OpenGL 应用的普遍做法类似。
将在后面的部分中具体阐述这些方法。
实现 onNewFrame
在呈现到人眼之前。使用 onNewFrame() 方法对呈现逻辑进行编码。 不论什么不属于单个视图特有的按帧操作都应在此处进行。
此处很适合更新您的模型。
在此代码段中,变量 mHeadView 包括头部的位置。 须要保存此值以便日后使用(用于了解用户是否正在寻宝):
/**
* Prepares OpenGL ES before we draw a frame.
* @param headTransform The head transformation in the new frame.
*/
@Override
public void onNewFrame(HeadTransform headTransform) {
...
headTransform.getHeadView(mHeadView, 0);
...
}
实现 onDrawEye
实现 onDrawEye() 以执行每仅仅眼睛的配置。
这是呈现代码的重要部分。与构建常见的 OpenGL ES2 应用很类似。 下面代码段显示怎样获取视图变换矩阵,也称为透视变换矩阵。 您必须确保低延时呈现。 Eye 对象包括眼睛的变换和投影矩阵。 下面是事件的顺序:
宝物进入眼睛的空间。
应用投影矩阵。
这能够提供为指定的眼睛呈现的场景。
Cardboard SDK 自己主动应用失真,以呈现终于的场景。
/**
* Draws a frame for an eye.
*
* @param eye The eye to render. Includes all required transformations.
*/
@Override
public void onDrawEye(Eye eye) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
...
// Apply the eye transformation to the camera.
Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0);
// Set the position of the light
Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0);
// Build the ModelView and ModelViewProjection matrices
// for calculating cube position and light.
float[] perspective = eye.getPerspective(Z_NEAR, Z_FAR);
Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0);
Matrix.multiplyMM(mModelViewProjection, 0, perspective, 0, mModelView, 0);
drawCube();
// Draw rest of the scene.
...
}
处理输入
Cardboard 观片器包括一个使用磁铁的button。
推动磁铁时。磁场会发生变化。而手机的磁力计能够检測到这样的变化。 因此,Cardboard SDK 能够为您检測到这些磁铁事件。
若要提供用户拉动磁铁时的自己定义行为,请在应用的 Activity 中重写CardboardActivity.onCardboardTrigger()。
在 treasure hunt 应用中,假设您发现了宝物并拉动磁铁,您就能够留下宝物:
/**
* Increment the score, hide the object, and give feedback if the user pulls the magnet while
* looking at the object. Otherwise, remind the user what to do.
*/
@Override
public void onCardboardTrigger() {
if (isLookingAtObject()) {
mScore++;
mOverlayView.show3DToast("Found it! Look around for another one.\nScore = " + mScore);
...
} else {
mOverlayView.show3DToast("Look around to find the object!");
}
// Always give user feedback
mVibrator.vibrate(50);
}
開始创建您自己的项目
如今。您对 Cardboard SDK for Android 有了很多其它的了解,能够创建您自己的应用了。
不管是从头開始创建一个新项目还是使用现有项目,均应依照下面步骤操作:
首先。从演示样例的 libs 目录(或 从此处进行下载)採集全部 jar 文件。并将其拷贝到项目的 app/libs 目录。
然后。确保项目的 app/build.gradle 文件里存在下列行:
dependencies {
...
compile fileTree(dir: 'libs', include: ['*.jar'])
}
如今。您能够使用 Cardboard SDK for Android 了!
Android 虚拟现实(virtual reality)入门指南的更多相关文章
- Android 音视频开发入门指南
Android 音视频从入门到提高 —— 任务列表 http://blog.51cto.com/ticktick/1956269(以这个学习为基础往下面去学习) Android 音视频开发学习思路-- ...
- 触摸屏键盘插件Virtual Keyboard 该怎么用 Virtual Keyboard 入门指南
最近公司有个项目,这个项目的显示器是触摸屏, 所以在一些需要简单输入的input需要加一个触摸屏的软键盘, 我在github上找了很多开源项目,最后选择了Virtual Keyboard, 以下是我自 ...
- Android(Lollipop/5.0) Material Design(二) 入门指南
Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...
- Android Studio入门指南 (历上最全,全球首发)
下载地址:http://pan.baidu.com/s/1CEMma 8月份的时候因为Android开发团队全部使用Android Studio进行开发,所以我整理了Android Studio的一些 ...
- 【HBase】HBase Getting Started(HBase 入门指南)
入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...
- VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?
整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...
- 【翻译】Fluent NHibernate介绍和入门指南
英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...
- 一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档
接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方 ...
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
随机推荐
- MySql和相关驱动的安装方式
下载mySql for java驱动的地址:http://www.mysql.com/products/connector/ (可下可不下,因为安装mySql的时候就会包含了各种驱动) MySQL下载 ...
- SVG.js 基础图形绘制整理(一)
一.矩形 //指定width和height 画矩形 //返回rect对象 var draw = SVG('svg1').size(300, 300); var rect = draw.rect(100 ...
- textrank的方法,大概懂了
https://www.cnblogs.com/clover-siyecao/p/5726480.html 介绍了textrank. 不过我觉得对于长文本,textrank才有用些.短文本的话,估计没 ...
- kendoui仪表盘和柱状图 示例
一说到kendeodui我相信大家一定不陌生,这套js在画图方面效果也不错. 现在来看一看 仪表盘和柱状图的效果吧: html和js代码如下: <!DOCTYPE html> <ht ...
- CSS阻塞渲染、怎么防止css阻塞
浏览器渲染流程: 1.浏览器开始解析目标HTML文件,执行流的顺序为自上而下. 2.HTML解析器将HTML结构转换为基础的DOM(文档对象模型),构建DOM树完成后,触发DomContendLoad ...
- tf.concat, tf.stack和tf.unstack的用法
tf.concat, tf.stack和tf.unstack的用法 tf.concat相当于numpy中的np.concatenate函数,用于将两个张量在某一个维度(axis)合并起来,例如: a ...
- AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法
AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法 2018-01-18 16:13蚂蚁金服/雾霾/人工智能 导读:词向量算法是自然语言处理领域的基础算法,在序列标注.问答系统和机 ...
- CRF++地名实体识别(特征为词性和词)
http://x-algo.cn/index.php/2016/02/29/crf-name-entity-recognition/ 类似使用CRF实现分词和词性标注,地域识别也是需要生成相应的tag ...
- 用Maven构建单机Mahout项目
Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...
- JAVA-MyBatis ORM
MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久 ...