Android的OpenGL学习笔记(5)
16lz
2021-12-04
Android的OpenGL学习笔记(5)
接着前面的知识学习,现在可以做一个3D的图形了,和以往一样,必要的解释都在注释中:
VortexRenderer.java代码:
Code:- packagecom.droidnova.android.games.vortex;
- importjava.nio.ByteBuffer;
- importjava.nio.ByteOrder;
- importjava.nio.FloatBuffer;
- importjava.nio.ShortBuffer;
- importjavax.microedition.khronos.egl.EGLConfig;
- importjavax.microedition.khronos.opengles.GL10;
- importandroid.opengl.GLSurfaceView;
- publicclassVortexRendererimplementsGLSurfaceView.Renderer{
- privatestaticfinalStringLOG_TAG=VortexRenderer.class.getSimpleName();
- //arawbuffertoholdindicesallowingareuseofpoints.
- privateShortBuffer_indexBuffer;
- //arawbuffertoholdthevertices
- privateFloatBuffer_vertexBuffer;
- //arawbuffertoholdthecolors
- privateFloatBuffer_colorBuffer;
- privateint_nrOfVertices=0;
- privatefloat_xAngle;
- privatefloat_yAngle;
- @Override
- publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
- //preparation
- //enablethedifferentiationofwhichsidemaybevisible
- gl.glEnable(GL10.GL_CULL_FACE);//enable了culling面,以保证只有一面。
- //whichisthefront?theonewhichisdrawncounterclockwise
- gl.glFrontFace(GL10.GL_CCW);//GL_CCW表示逆时针,定义了哪种顺序为前面。GL_CW表示逆时针
- //whichoneshouldNOTbedrawn
- gl.glCullFace(GL10.GL_BACK);//设置其为GL_BACK以保证只显示正面.这或许有点迷糊偶,
- //你可以看看如果用GL_FRONT_AND_BACK会发生什么……你将什么也看不到。
- gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//允许设置顶点
- gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//允许设置顶点颜色
- initTriangle();
- }
- @Override
- publicvoidonSurfaceChanged(GL10gl,intw,inth){
- gl.glViewport(0,0,w,h);
- }
- publicvoidsetXAngle(floatangle){
- _xAngle=angle;
- }
- publicfloatgetXAngle(){
- return_xAngle;
- }
- publicvoidsetYAngle(floatangle){
- _yAngle=angle;
- }
- publicfloatgetYAngle(){
- return_yAngle;
- }
- @Override
- publicvoidonDrawFrame(GL10gl){
- //definethecolorwewanttobedisplayedasthe"clippingwall"
- gl.glClearColor(0f,0f,0f,1.0f);
- //resetthematrix-goodtofixtherotationtoastaticangle
- gl.glLoadIdentity();
- //clearthecolorbufferandthedepthbuffertoshowtheClearColor
- //wecalledabove...
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- //setrotation
- gl.glRotatef(_xAngle,1f,0f,0f);
- gl.glRotatef(_yAngle,0f,1f,0f);
- //gl.glColor4f(0.5f,0f,0f,0.5f);
- gl.glVertexPointer(3,GL10.GL_FLOAT,0,_vertexBuffer);
- gl.glColorPointer(4,GL10.GL_FLOAT,0,_colorBuffer);
- gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,
- GL10.GL_UNSIGNED_SHORT,_indexBuffer);
- }
- privatevoidinitTriangle(){
- float[]coords={
- -0.5f,-0.5f,0.5f,//0
- 0.5f,-0.5f,0.5f,//1
- 0f,-0.5f,-0.5f,//2
- 0f,0.5f,0f,//3
- };
- _nrOfVertices=coords.length;
- float[]colors={
- 1f,0f,0f,1f,//point0red
- 0f,1f,0f,1f,//point1green
- 0f,0f,1f,1f,//point2blue
- 1f,1f,1f,1f,//point3white
- };
- short[]indices=newshort[]{
- 0,1,3,//rwg
- 0,2,1,//rbg
- 0,3,2,//rbw
- 1,2,3,//bwg
- };
- //floathas4bytes,coordinate*4bytes
- ByteBuffervbb=ByteBuffer.allocateDirect(coords.length*4);
- vbb.order(ByteOrder.nativeOrder());
- _vertexBuffer=vbb.asFloatBuffer();
- //shorthas2bytes,indices*2bytes
- ByteBufferibb=ByteBuffer.allocateDirect(indices.length*2);
- ibb.order(ByteOrder.nativeOrder());
- _indexBuffer=ibb.asShortBuffer();
- //floathas4bytes,colors(RGBA)*4bytes
- ByteBuffercbb=ByteBuffer.allocateDirect(colors.length*4);
- cbb.order(ByteOrder.nativeOrder());
- _colorBuffer=cbb.asFloatBuffer();
- _vertexBuffer.put(coords);
- _indexBuffer.put(indices);
- _colorBuffer.put(colors);
- _vertexBuffer.position(0);
- _indexBuffer.position(0);
- _colorBuffer.position(0);
- }
- }
VortexView.java代码:
Code:- packagecom.droidnova.android.games.vortex;
- importandroid.content.Context;
- importandroid.opengl.GLSurfaceView;
- importandroid.view.MotionEvent;
- publicclassVortexViewextendsGLSurfaceView{
- privatestaticfinalStringLOG_TAG=VortexView.class.getSimpleName();
- privateVortexRenderer_renderer;
- privatefloat_x=0;
- privatefloat_y=0;
- privatefloat_z=0;
- publicVortexView(Contextcontext){
- super(context);
- _renderer=newVortexRenderer();
- setRenderer(_renderer);
- }
- publicbooleanonTouchEvent(finalMotionEventevent){
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- _x=event.getX();
- _y=event.getY();
- }
- if(event.getAction()==MotionEvent.ACTION_MOVE){
- finalfloatxdiff=(_x-event.getX());
- finalfloatydiff=(_y-event.getY());
- queueEvent(newRunnable(){
- publicvoidrun(){
- _renderer.setXAngle(_renderer.getXAngle()+ydiff);
- _renderer.setYAngle(_renderer.getYAngle()+xdiff);
- }
- });
- _x=event.getX();
- _y=event.getY();
- }
- returntrue;
- }
- }
最终效果图:
更多相关文章
- Android(安卓)关于获取摄像头帧数据
- android学习轨迹之二:Android权限标签uses-permission的书写位置
- Android(安卓)自定义view画圆
- 华为手机Android(安卓)Studio开发不显示Logcat解决办法
- Android(安卓)Studio 修改 Logcat 颜色
- Android(安卓)设置没有 actionBar的 样式
- Android中ListView中Item的设置
- Android(安卓)Toolbar
- Android(安卓)屏幕设置