3D绘图之OpenGL ES
来源:互联网 发布:2016年乳腺发病率数据 编辑:程序博客网 时间:2024/04/30 10:38
1.编写一个实现Renderer接口的类
- onSurfaceChanged:设置视口大小,设置投影类型,矩阵模式,切换投影类型等
- onSurfaceCreated:一些初始化工作,如设置顶点坐标的值.
- onDrawFrame:对开关的操作,绘制3D图形,设置顶点坐标等
class RectangleRender implements GLSurfaceView.Renderer{ //定义顶点 int one=0x10000; IntBuffer rectangleBuffer; int[] rectangleVertices=new int[] { -one,-one,0, -one,one,0, one,-one,0, one,one,0, }; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //为ByteBuffer对象分配内存空间 ByteBuffer byteBuffer=ByteBuffer.allocateDirect(rectangleVertices.length*4); //按本地字节顺序使用字节数据 byteBuffer.order(ByteOrder.nativeOrder()); //将ByteBuffer转换成intBuffer对象 rectangleBuffer=byteBuffer.asIntBuffer(); //将定义顶点坐标的int数组放到intBuffer对象中 rectangleBuffer.put(rectangleVertices); //将IntBuffer对象的内部指针移到第1个字节的位置 rectangleBuffer.position(0); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { //计算视口宽度与高度比 float ratio=width/height; //设置视口大小 gl.glViewport(0,0,width,height); //改变矩阵模式为投影模式 gl.glMatrixMode(GL10.GL_FOG_MODE); //将当前矩阵设为单位矩阵 gl.glLoadIdentity(); //设置当前的投影类型为透视投影 gl.glFrustumf(-ratio,ratio,1,1,1,10); //改变矩阵模式为模型视图矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); } @Override public void onDrawFrame(GL10 gl) { //必须清楚屏幕,否则不会清除上次的视图 gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BITS); //允许使用顶点方式绘制图形 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //将当前矩阵设为单位矩阵 gl.glLoadIdentity(); //将当前位置向z轴负方向移6个单位 gl.glTranslatef(0,0,-6); //旋转90度 gl.glRotatef(90,0,1,0); //装载用于绘制图形的顶点坐标// gl.glVertexPointer(3,GL10.GL_FIXED,0,rete); //绘制图形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4); //禁止使用顶点方式绘制图形 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } }eg:绘制三角形
1.Triangle类
package com.gst.user.application;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.IntBuffer;import javax.microedition.khronos.opengles.GL10;/** * Created by user on 1/5/16. */public class Triangle { int one = 0x10000; private IntBuffer triangleBuffer; private int[] triangleVertices = new int[] { 0, one, 0, -one, -one, 0, one, -one, 0 }; public Triangle() { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangleVertices.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); triangleBuffer = byteBuffer.asIntBuffer(); triangleBuffer.put(triangleVertices); triangleBuffer.position(0); } public void drawSelf(GL10 gl){ gl.glVertexPointer(3,GL10.GL_FIXED,0,triangleBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); gl.glRotatef(180, 0, 0, 1); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); }}2.TriangleSurfaceView
package com.gst.user.application;import android.opengl.GLSurfaceView;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;/** * Created by user on 1/5/16. */public class TriangleSurfaceView implements GLSurfaceView.Renderer{ Triangle triangle; int angle1=0; int angle2=0; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { triangle=new Triangle(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio=(float)width/height; gl.glViewport(0,0,width,height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-ratio * 2, ratio * 2, -2, 2, 1, 10); gl.glMatrixMode(GL10.GL_MODELVIEW); } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glLoadIdentity(); gl.glTranslatef(0, 0, -2); gl.glRotatef(angle1++, 0, 0, 1); triangle.drawSelf(gl); gl.glLoadIdentity(); angle2-=2; gl.glRotatef(angle2, 0, 0, 1); gl.glTranslatef(-3, 0, -4); gl.glRotatef(45, 0, 0, 1); triangle.drawSelf(gl); gl.glLoadIdentity(); gl.glRotatef(angle2, 0, 0, 1); gl.glTranslatef(3, 0, -4); gl.glRotatef(45, 0, 0, 1); triangle.drawSelf(gl); gl.glLoadIdentity(); gl.glRotatef(angle2, 0, 0, 1); gl.glTranslatef(0,3,-4); gl.glRotatef(45,0,0,1); triangle.drawSelf(gl); gl.glLoadIdentity(); gl.glRotatef(angle2, 0, 0, 1); gl.glTranslatef(0,-3,-4); gl.glRotatef(45,0,0,1); triangle.drawSelf(gl); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }}3.在Activity的onCreate方法中显示
GLSurfaceView glSurfaceView=new GLSurfaceView(this); glSurfaceView.setRenderer(new TriangleSurfaceView()); setContentView(glSurfaceView);
0 0
- 3D绘图之OpenGL ES
- 2D/3D绘图(Skia、OpenGL/ES)-android
- 3D: OpenGL ES
- 3D OpenGL ES
- OpenGL ES之二 – 简单绘图
- android3D绘图之OpenGL ES(一)
- android3D绘图之OpenGL ES(二)
- Android3D绘图之OpenGL ES(三)
- Android3D绘图之OpenGL ES(四)
- OPENGL-ES之顶点索引绘图
- OpenGL ES绘制3D
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程 03 <3D绘图基本概念>
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- 关于DecimalFormat用法详解
- PostGresql字符串函数
- Minecraft Forge编程入门二 “工艺和食谱”
- Android四大组件之广播接收器 Broadcast Receiver
- perl脚本去除文件中重复数据
- 3D绘图之OpenGL ES
- Java用String 截取方式解析xml文件、处理大xml文件
- HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活(多重背包)
- fibonacci 的不同解法
- iOS开发之根据图片宽高等比例压缩图片
- iOS plist文件
- Xcode升级了 插件失效的解决方法
- android 利用packageManager更新版本
- YiiBooster使用:中文语言问题