使用 Android 和 OpenglES 进行移动增强现实






4.84/5 (11投票s)
如何使用 Android SDK 和 OpenGL ES 创建一个基本的增强现实应用程序。
引言
在本文中,我将描述如何使用 Android SDK 和 OpenGL ES 创建一个基本的增强现实应用程序。该应用程序会在相机表面(现实世界)上叠加一个 3D 立方体(虚拟对象)。
背景
为了使用 Java 开发 Android,您需要在您的 PC 上安装以下软件:Sun JDK 6、Android SDK、Eclipse IDE 3.6 或更高版本、Eclipse 的 ADT 插件。
如果您是 Android 开发的初学者,我建议您阅读此链接中的《Professional Android for Application Development》一书的第一部分:http://it-ebooks.info/book/718/。
Using the Code
此处附带的项目源代码包含一个 Android 项目,其中包含四个 Java 类。Cube
类是绘图类。一个立方体由从 0 到 7 索引的八个顶点定义。下面的索引数组描述了调用顶点的顺序,以便绘制立方体的每个面。
// The array of indices
private byte indices[] = {
0, 4, 5, 0, 5, 1,
1, 5, 6, 1, 6, 2,
2, 6, 7, 2, 7, 3,
3, 7, 4, 3, 4, 0,
4, 7, 6, 4, 6, 5,
3, 0, 1, 3, 1, 2
};
执行绘图的方法是方法 void draw (GL10 gl)
,这得益于 gl
函数 glDrawElements
。在这种情况下,glDrawElements
通过调用 GL_TRIANGLES
来执行 3D 绘图,该函数将每个顶点三元组解释为三角形。
// Drawing a 3D cube
public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CW);
// some code
gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);
//some code
}
GLClearRenderer
类是渲染类。它实现了 Android OpenGL 包中的接口 GLSurfaceView.Renderer
。该类必须实现 Render
的三个继承方法
OndrawFrame(GL 10)
会为每一帧调用以进行绘制。此方法调用Cube
类的 draw 方法。
// Rendering a 3D cube on Android Opengl
// This method is called per frame, as the name suggests.
public void onDrawFrame( GL10 gl ) {
//
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
gl.glRotatef(mCubeRotation, 1.0f, 1.0f, 1.0f);
// invoke the draw method of cube class
mCube.draw(gl);
gl.glLoadIdentity();
mCubeRotation -= 0.15f;
}
void onSurfaceChanged( GL10 gl, int width, int height )
会在表面尺寸发生变化时调用。void onSurfaceCreated( GL10 gl, EGLConfig config )
会在首次创建表面时调用。Camera View 类允许我们访问相机的流式视频,这意味着我们可以将实时视频合并到我们的应用程序中。要访问相机硬件,您需要在应用程序清单中添加 CAMERA 权限,如下所示
<uses-permission android:name=”android.permission.CAMERA”/>
在 Camera View 类中,我们实例化一个 hardware.Camera
类型的对象并打开一个相机硬件的句柄
Private Camera camera;
//start up the camera
Camera = Camera.open();
主类是 CameraProjectActivity
,它是一个 Android Activity。该类重写了 onCreate
方法,该方法在首次创建 Activity 时调用。在此方法内部,我们创建一个 OpenGL 表面 View
GLSurfaceView glView = new GLSurfaceView( this );
要查看相机预览,必须以半透明的方式创建 OpenGL 表面。
glView.setEGLConfigChooser( 8, 8, 8, 8, 16, 0 );
glView.getHolder().setFormat( PixelFormat.TRANSLUCENT);
我们将 GLView Render 设置为在上面描述的 GLClearRenderer
类中实现的渲染器。
glView.setRenderer( new GLClearRenderer() );
现在创建一个包含相机预览的视图,并将其添加到表面视图,覆盖整个屏幕尺寸。
CameraView cameraView = new CameraView( this );
addContentView( cameraView, new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) );
关注点
将项目加载到 Android 移动设备上并构建它。请查看此教程,了解如何在移动设备上调试 Android 项目:https://developer.android.com.cn/tools/device.html。
应用程序应该如下所示