OpenGl绘制旋转三角形实例

标签:
杂谈 |
分类: OpenGl |
在Android中我们使用GLSurfaceView来显示OpenGL视
图,GLSurfaceView:是其中很重要的一个类,此类位于android.opengl包下,用于管理是一块可以是复合视图机器人系统的内存的特
殊的曲面。管理一个使表面呈现 OpenGL 的 EGL 显示。接受一个用户提供输入Render对象进行显示。从 UI
线程实现一个专用线程渲染界面实现3D性能。所以这里我们先来构建一个自己的Renderer类,
接下来是我们的核心类HelloOpenGLES10Renderer实现了Renderer接口:
上面的方法基本上都做了注释,相信大家能够理解,
[html] view plaincopy
-
public
class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer { -
}
在HelloOpenGLES10Renderer类中必须实现Renderer接口的三个抽象方法:onDrawFrame,onSurfaceChanged,onSurfaceCreated
下面我们通过一个实例来演示下:
[html] view plaincopy
-
class
HelloOpenGLES10SurfaceVi ew extends GLSurfaceView { -
public HelloOpenGLES10SurfaceVi ew(Context context){ -
super(context); -
-
setRenderer(new HelloOpenGLES10Renderer()); -
-
}
[html] view plaincopy
-
@Override
-
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
-
GLSurfaceView view=new HelloOpenGLES10SurfaceVi ew(this); -
-
setContentView(view); -
}
接下来是我们的核心类HelloOpenGLES10Renderer实现了Renderer接口:
[html] view plaincopy
-
public
class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer { -
-
float rotateTri, rotateQuad; -
private FloatBuffer triangleVB; -
-
// 正方形的四个顶点 -
private FloatBuffer quateBuffer; -
-
-
private void initQuate() { -
-
float[] four = { -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -
0.5f, 0.5f, 0.5f, 0.5f, }; -
-
ByteBuffer vbb = ByteBuffer.allocateDirect( -
//分配缓冲空间,一个float占4个字节 -
four.length * 4); -
vbb.order(ByteOrder.nativeOrder());//设置字节顺序, 其中ByteOrder.nativeOrder()是获取本机字节顺序 -
quateBuffer = vbb.asFloatBuffer();//转换为float型 -
quateBuffer.put(four); //添加数据 -
quateBuffer.position(0); //设置数组的起始位置 -
-
} -
-
private void initShapes() { -
-
float triangleCoords[] = { -
// X, Y, Z -
-0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 }; -
-
ByteBuffer vbb = ByteBuffer.allocateDirect( -
triangleCoords.length * 4); -
vbb.order(ByteOrder.nativeOrder()); -
triangleVB = vbb.asFloatBuffer(); -
triangleVB.put(triangleCoords); -
triangleVB.position(0); -
-
} -
-
public void onSurfaceCreated(GL10 gl, EGLConfig config) { -
// 设置背景色 -
gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); -
-
initShapes(); -
initQuate(); -
-
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); -
-
} -
-
//所有的绘图操作都在此方法中执行 -
public void onDrawFrame(GL10 gl) { -
-
//清楚屏幕和深度缓存 -
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); -
//切换至模型观察矩阵 -
gl.glMatrixMode(GL10.GL_MODELVIEW); -
//重置当前的模型观察矩阵 -
gl.glLoadIdentity(); -
//确定视图点 -
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); -
-
-
-
-
//创建一个旋转三角形 沿Y轴旋转 -
gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f); -
// 画一个三角形 -
//设置当前颜色 -
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); -
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB); -
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); -
-
//沿X轴正方形移动1个单位 -
gl.glTranslatef(1.0f, 0.0f, 0.0f); -
-
// 创建一个旋转的正方形 沿X轴旋转 -
gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f); -
// 画一个正方形 -
gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); -
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer); -
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); -
-
// 改变旋转角度 -
rotateTri += 0.5f; -
rotateQuad -= 0.5f; -
} -
-
public void onSurfaceChanged(GL10 gl, int width, int height) { -
-
//设置OpenGL的场景大小 -
gl.glViewport(0, 0, width, height); -
-
float ratio = (float) width / height; -
gl.glMatrixMode(GL10.GL_PROJECTION); //设置投影矩阵 -
gl.glLoadIdentity(); //设置矩阵为单位矩阵,相当于重置矩阵 -
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 应用投影矩阵 -
-
} -
-
}
上面的方法基本上都做了注释,相信大家能够理解,
最后看一下运行效果吧!
http://my.csdn.net/uploads/201204/03/1333462465_8339.jpg
http://my.csdn.net/uploads/201204/03/1333462481_1773.jpg
转自:http://blog.csdn.net/wangkuifeng0118/article/details/7424480
后一篇:OpenGl绘制旋转立方体实例