65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (11投票s)

2013年2月19日

CPOL

2分钟阅读

viewsIcon

61667

downloadIcon

4290

如何使用 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

应用程序应该如下所示

© . All rights reserved.