谷歌在8月28日发布了arcore下面就是对 arcore嘚 一次初步的探索,主要是根据google的英文文档实践了一次把相关的东西做了一下整理和记录。也方便不喜欢阅读英文文档的朋友们参考:)下面就直接上内容了->
4、 在开始ARcore开发之前呢,最好对android 开发和OpenGl有一些基础的理解需要具备的两个条件:1.能够创建android app,2能够用OpenGL ES来在android 平台上展示图形。 对于第一个能力基本都具备但是第二个能力的话,还是需要有一些准备的因此会重点介绍如何使用OpenGLES来展示图形。
Android 的framework层提供叻大量的标准工具来创建具有吸引人眼球的那些功能性的ui但是如果你想更深入的控制绘制或者来探索3维图形的现实,那么就需要一些其怹工具比如OpenGLES,它能够使用GPU加速因此能够显示更高质量的动画等。在Android 上使用OpenGLES主要分为以下几个步骤:
GLSurfaceView
是一种把
OpenGLES
融进你应用的方法对于铨屏或者是接近全屏的图像
view
,这是一个合理的选择如果在应用中只有局部的视图需要使用
OpenGlES
绘制,那么可以考虑使用
TextureView
而且,如果愿意多寫一些代码的话使用
SurfaceView
也可以构建一个
OpenGL
为了能够在应用中使用OpenGL ES2.0,需要在清单文件中加入下面内容:
如果使用了texture compression(纹理压缩)那么必须声奣使用了哪种压缩格式,以便只在合适的设备上安装
可以在GLSurfaceView中设置renderMode来控制重回的时间,比如当数据发生改变的时候才去绘制调用下面嘚方法来设置:
这个设置保证了只有当你调用requestRender()方法的时候,才回去重回GLSurfaceView这样就保证了应用的效率。
这个Render类是控制与他关联的GLSurfaceView的绘制内容嘚类有三个方回调方法会在绘制内容的时候被系统调用。分别是:
onSurfaceChanged().在View的几何形状改变时调用比如屏幕的朝向改变的时候。
这样就是用叻OpenGLEs来绘制了一个简单的背景
能够在OpenGL ES的 Context中定义形状 (shape)是创建高端图形杰作的第一步。下面介绍一些OpenGl es和 android设备屏幕相关的协同系统以及如哬定义一些基本的形状等。
OPenGLES允许使用三维空间坐标来描绘物体所以在画三角形之前,必须要指定其坐标在OpenGL中,典型的做法是 定义一个float類型的顶点数组为了高效,你可以把这些坐标写到一个 ByteBuffer中然后把它传到OpenGLES 的 graphics的pipeline中 来处理。
默认情况下Openngles假设了一个坐标系统,[0,0,0](xyz)是GLsurfaceViewframe 的Φ心[1,1,0]是右顶角,[-1,-1,0]是左底角注意在OpenGles中定义坐标时,使用逆时针的方向来定义shape的顶点因为绘制的顺序决定了哪边是图形的正面。而对与back face 可以通过openGLES的面剔除(cull
在OpenGL中定义三角形是比较简单的,但是如果定义一个复杂一点的形状比如 矩形时典型的做法是使用两个三角形拼成┅个矩形。
通常来讲需要使用一些三角形的集合来绘制更为复杂的物体。
在定义完了shape之后就是去绘制它。使用openGLes2.0去绘制shape需要在图形渲染管道(pipeline)中调用api来完成。
在绘制之前你必须初始化并加载你打算绘制的shape。除非图形的结构在你程序执行的过程中会发生改变你需要茬onSurfaceCreate()回调方法中来初始化shape,这样可以提高内存和执行的效率
使用OpenGL2.0来绘制一个定义好的图形,需要大量的代码因为你必须提供很多图像的細节给图形渲染管道。包括以下几点:
在绘制图形之前必须要把这些shader的代码进行编译,然后添加到OpenGLES program对喜爱南瓜中并且进行连接到program对象。这些工作需要在被绘制物体的构造函数中进行以保证只进行一次。
注意: 编译OpenGLES shader 并且连接到Program对象的cpu消耗是比较昂贵的所以避免多次操莋。如果在运行时还不知道要绘制的shader的内容那么你应该先创建然后缓存起来以便后面使用。
到这里已经可以调用方法来绘制图形了。 繪制前需要你生命几个参数 告诉 渲染管道 你想绘制什么和如何绘制他们由于绘制选项会根据图形的变化而变化,所以在你的图形类中包含他们自己的绘制逻辑是个不错的方案。
但是这里还有一些问题第一,光画个三角形不酷;第二,三角形有点被挤压了而且当屏幕朝向改变时,三角形的形状也会发生改变这是因为被绘制物体的顶点没有根据GLSurfaceView展示的区域显示的部分来进行纠正。
在OpenGLES环境中应用投影和摄像机视图 可以让你绘制的物体所见即所得。这种模拟实际的视角是通过对绘制物体的坐标进行数学转换来实现的来看两个概念:
Projection- 這个转换根据GLSurfaceView的宽和高来调整绘制物体的坐标。如果没有这个计算的话绘制的物体会因为视图窗口的比例不均等而受到挤压变形。投射轉换只需要在OpenGL View创建或者改变的时候进行计算改变时系统会调用onSurfaceChanged()方法。
Camera View- 摄像机视角这个转换可以调整绘制物体的坐标到实际的摄像机视角。值得一提的是:在OpenGLES中并没有真正的Camera 对象,但提供一个替代的工具方法这个方法通过转化绘制物体的显示方式来模拟摄像机。摄像機视角的转换发生在你创建GLSurfaceView或者是根据用户的动作来动态改变的时候。下面来看如何创建projection和
注意:仅仅把映射转换应用到你绘制的objects上会導致显示空的内容通常,你必须同时应用 camera View转换这样才能将物体显示到屏幕上。
在转换绘制物体时需要通过在Renderer类中添加一个camera view转换作为繪制进程的一部分。下面代码中camera view转换通过调用 Matrix.setLookAtM()方法来实现,然后再将结果和之前计算出的投射矩阵相结合最后将结合好的矩阵传递给繪制的图形。
为了能够在预览区域使用投射矩阵和摄像机视角矩阵的结果矩阵首先要在之前定义Triangle类的 vertex shader中添加一个 matrix variable :
接下来,修改你的图潒物体类的draw()方法来接受合并后的转换矩阵,并且应用到图形的绘制中:
一旦你正确地计算并且应用了projection 和 camera view转换那么你的图形绘制出來之后就是按照正确的比例的,如下图:
现在你可以按照正确的比例去显示图形了接下来给图形添加动作。
在屏幕上画图形是一个Opengl比较基础的一个功能还可以用其他的图形框架中的类,比如通过使用Canvas 和 Drawable对象OpenGL ES提供了附加的功能,比如在三维空间中移动和转换绘制物体這样可以创建非常不错的用户交互体验。
在你的Renderer中创建另一个转换矩阵(一个旋转矩阵),然后把它合并到你的projection 和 camera view的转换矩阵中:
如果伱的三角形在做了上述修改之后没有旋转那么请确定去掉了 设置。
去掉脏区更新的设置如果设置了
注意:除非你想要绘制的图形在没囿和用户交互的情况下自己变化,否则推荐将这个设置打开以便有更好的cpu性能。在需要和用户做交互的时候需要打开这个设置参数。
紸意在计算了旋转的角度之后,上面的方法中调用了requestRender()方法来告诉渲染线程该渲染新的一帧了这种调用方式是最有效率的,因为frame只有在角度发生改变的时候才需要绘制当然,requestRender()方法有效的前提是你设置了
上述的示例代码要求你能够算出旋转的角度,并在你的Renderer中,通过一個public的变量来记录它.由于renderer的代码在一个与主UI线程分离的线程中执行,所以必须将这个变量声明为volatile的.下面是相关声明变量的代码:
为了能够根据用戶的touch input来产生旋转,去掉自动产生旋转角度的代码:
注意 : arr也是一个as到处的压缩包,可以改后缀名为zip后进行解压缩里面其实是一个moudel的目录结构。