android3D绘图之OpenGL ES(一)

这是我刚刚接触3D这个概念,听说这里面涉及到很多难懂的概念,我在学的时候确确实实碰到很多难懂的概念,不过纵然难懂,这道坎还是要迈过去不是,所以我今天把这些好基础的概念在这里写一遍,以便来查漏补缺我思维上的漏洞。

什么是OpenGL 英文名是Open Graphics Lisbrary 开放式图形库,OpenGL ES是可以在移动设备上使用的简化版OpenGL,如何绘制一个3D图形,我们需要做什么呢?

1、设置视口的大小

2、设置矩阵模式

3、设置投影类型(正交投影或是透视投影),这一步将视图切换到投影模式

4、将视图切换到模型和视图模式

5、清空屏幕

6、打开相关的开关

接下还有一些收尾的工作,比如关掉绘图之前打开的开关。

首先我们需要写一个实现Renderer接口的类。

需要重写3个方法

onDrawFrame:开关的操作,绘制3D图形,设置顶点坐标等操作

onSurfaceChanged:设置视口大小,设置投影类型,矩阵模式,切换投影模式

onSurfaceCreated:进行一些初始化的工作。

下面是一个绘制三角形的小例子。

Triangle.java  这用来封装绘制三角形的代码,以便可以重用

package com.example.triangle_01;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

import javax.microedition.khronos.opengles.GL10;

public class Triangle {

	//采用16进制换成的1
	int one = 0x10000;
	private IntBuffer triangleBuffer;
	private int[] triangleVertices = new int[]{
		0,one,0,-one,-one,0,one,-one,0	
	};
	
	public Triangle(){
		//将int类型的坐标值放到inBuffer对象中
		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){
		//将3个顶点坐标装载到内存中
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);
		//绘制三角形
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
	}
}

下面这个类实现了Renderer这个借口,并复写三个方法

package com.example.triangle_01;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class TriangleSurfaceView implements Renderer{

	private Triangle triangle;
	@Override
	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

		gl.glLoadIdentity();
		//移位
		gl.glTranslatef(1.0f, 0.0f, -2.0f);
		//绘制三角形
		triangle.drawSelf(gl);
		
		gl.glLoadIdentity();
		gl.glTranslatef(0.0f, 0.0f, -8.0f);
		triangle.drawSelf(gl);
		
		gl.glLoadIdentity();
		gl.glTranslatef(-2.0f, 1.0f, -4.0f);
		triangle.drawSelf(gl);
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub
		float radio = (float)width/height;
		//设置视口大小
		gl.glViewport(0, 0, width, height);
		//设置当前矩阵模式为投影模式
		gl.glMatrixMode(GL10.GL_PROJECTION);
		gl.glLoadIdentity();
		//设置透视投影的刻度范围
		gl.glFrustumf(-radio*2, radio*2, -2, 2, 1, 10);
		//设置当前矩阵模式为模型视图矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
	}

	@Override
	public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
		// TODO Auto-generated method stub
		triangle = new Triangle();
	}

}

装载View

package com.example.triangle_01;

import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		GLSurfaceView glSurfaceView = new GLSurfaceView(this);
		glSurfaceView.setRenderer(new TriangleSurfaceView());
		setContentView(glSurfaceView);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

这样,三角形就绘制好了,我也是调了好多遍才渐渐明白这到底是怎么回事,所以还是得慢慢来啊,欲速则不达啊!!好了,加油!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值