1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形 显示 旋转

android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形 显示 旋转

时间:2022-10-21 17:44:02

相关推荐

android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形 显示 旋转

,###1.在你的应用程序中用OpenGl Es来开发,少不了两个抽象类,一个是GLSurfaceView,一个是GLSurfaceView.Renderer. GLSurfaceView是一个显示容器而GLSurfaceView.Renderer主要完成容器中的绘制工作。

2.在使用opengl es之前,需要在android manifest中的声明所用的版本,如OpenGl ES 3.0 API

<!-- Tell the system this app requires OpenGL ES 3.0. --><uses-feature android:glEsVersion="0x00030000" android:required="true" />

3.本示例像其它的方式一样用来画一个三角形。

基本方法:1.创建GLSurfaceView组件,并用activity来显示。2.实现GLSurfaceView.Renderer中的三个方法,如果对OpenGL ES的基础知识不了解,可以参考前一篇博文。3.调用GLSurfaceView组件的setRenderer()指定Renderder对象,该对象将完成GLSurfaceView的3D绘制,下面直接上源码,已经全上注释。

###Main.java

package com.dragon.opengles02;import android.opengl.GLSurfaceView;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class Main extends AppCompatActivity {private GLSurfaceView mGLView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.main);// define a GlSurfaceView 容器,用于显示OpenGL的图形mGLView = new GLSurfaceView(this);// 创建GLSurfaceView绘制器MyRenderer myRenderer = new MyRenderer();mGLView.setRenderer(myRenderer);//只有在数据改变时才进行Render,这样来提高性能mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);setContentView(mGLView);}}

MyRenderer.java

package com.dragon.opengles02;import android.opengl.GLSurfaceView;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;/*** This file created by dragon on /8/2 14:45,* belong to com.dragon.opengles02 .*/public class MyRenderer implements GLSurfaceView.Renderer {float[] triangleData = new float[]{0.1f,0.6f,0.0f,//上顶点-0.3f,0.0f,0.0f,//左0.3f,0.1f,0.0f//右};float[] triangleColor = new float[]{1.0f,0,0,0,//上->red0,1.0f,0,0,//左->green0,0,1.0f,0//右->blue};// 定义缓冲数据FloatBuffer triangleDataBuffer;FloatBuffer triangleColorBuffer;public MyRenderer(){// 将数组->FloatBuffertriangleDataBuffer = floatBufferUtil(triangleData);// 颜色数据->IntBuffertriangleColorBuffer = floatBufferUtil(triangleColor);}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config){// 关闭抗抖动gl.glDisable(GL10.GL_DITHER);// 设置系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);gl.glClearColor(0, 0, 0, 0);// 设置阴影平滑模式gl.glShadeModel(GL10.GL_SMOOTH);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 设置深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);}@Overridepublic void onSurfaceChanged(GL10 gl,int width,int height){// 设置3D视窗的大小及位置gl.glViewport(0, 0, width, height);// 将当前矩阵模式设为投影矩阵gl.glMatrixMode(GL10.GL_PROJECTION);// 初始化单位矩阵gl.glLoadIdentity();// 计算透视视窗的宽度、高度比float ratio = (float) width / height;// 调用此方法设置透视视窗的空间大小gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);}@Overridepublic void onDrawFrame(GL10 gl){// 清除屏幕缓存和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 启用顶点坐标数据gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// 启用顶点颜色数据gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置当前矩阵堆栈为模型堆栈gl.glMatrixMode(GL10.GL_MODELVIEW);// --------------------绘制三角形---------------------// 重置当前的模型视图矩阵gl.glLoadIdentity();gl.glTranslatef(-0.32f, 0.35f, -1.2f); // ①// 设置顶点的位置数据gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer);// 设置顶点的颜色数据gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);// 根据顶点数据绘制平面图形gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);// 绘制结束gl.glFinish();gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}private FloatBuffer floatBufferUtil(float[] arr){FloatBuffer mBuffer;ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length*4);qbb.order(ByteOrder.nativeOrder());mBuffer = qbb.asFloatBuffer();mBuffer.put(arr);mBuffer.position(0);return mBuffer;}}

4.效果展示,最终的代码实现了模型的旋转,在github上可以发现:

如果你还有问题没解决,你可以加入我们一起交流,专注于AR的在移动端的实现

或是关注我们的技术公众号,提供技术干货的地方,你有干货可以联系本人代发。

如果你觉得写的不错,对你有用,请在下面点个支持一下嘛,有问题可以在下面留言评论。

5.github源码传送门源码下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。