1.如图:
2.代码
/**
* @描述 使用opengl绘制螺旋线
* @项目名称 App_OpenGL
* @包名 com.android.opengl
* @类名 SpiralMainActivity
* @author chenlin
* @date 2014年5月12日 下午10:57:20
* @version 1.0
*/
public class SpiralMainActivity extends Activity {
private static float ANGLE = -90F;
private static float pos_x = 1f;
private static float pos_y = 0f;
private static float POS_Z = 0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyGlSurfaceView surfaceView = new MyGlSurfaceView(this);
surfaceView.setRenderer(new MyRender());
setContentView(surfaceView);
}
private class MyGlSurfaceView extends GLSurfaceView {
public MyGlSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGlSurfaceView(Context context) {
super(context);
}
}
/**
* 根据按键改变位置
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
float step = 0.5f;
// 判断按键
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
pos_x = pos_x - step;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
pos_x = pos_x + step;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
pos_y = pos_y - step;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
pos_y = pos_y + step;
}
return super.onKeyDown(keyCode, event);
}
private class MyRender implements Renderer {
private float mRatio;
// 表层创建时
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 清平色(r,g,b,alpha)
gl.glClearColor(0f, 0f, 0f, 1f);
// 启用顶点缓冲区数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
// 表层size时
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
mRatio = width * 1.0f / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-1f, 1f, -mRatio, mRatio, 3f, 7f);
}
// 绘图
@Override
public void onDrawFrame(GL10 gl) {
// 清除颜色缓存区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 设置绘图颜色
gl.glColor4f(1f, 0f, 0f, 1f);
// 操作模型矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
// 设置眼睛的观测点
GLU.gluLookAt(gl, 0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
// 旋转
// gl.glRotatef(-90f, 1, 0, 0 );
gl.glRotatef(ANGLE, pos_x, pos_y, POS_Z);
// 绘制圆形
float r = 0.5f;// 半径
List<Float> coordsList = new ArrayList<Float>();
// 定义圆心坐标
float x = 0f, y = 0f, z = 1.5f;
float zstep = 0.01f;
for (float i = 0f; i < Math.PI * 6; i = (float) (i + Math.PI / 32)) {
// 得到旋转时的坐标
x = (float) (r * Math.cos(i));
y = (float) (r * Math.sin(i));
z = z - zstep;
coordsList.add(x);
coordsList.add(y);
coordsList.add(z);
}
ByteBuffer bb = ByteBuffer.allocateDirect(coordsList.size() * 4);
bb.order(ByteOrder.nativeOrder());
FloatBuffer fb = bb.asFloatBuffer();
for (float f : coordsList) {
fb.put(f);
}
bb.position(0);
// 指定顶点指针
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, bb);
// 绘制多少个点
gl.glDrawArrays(GL10.GL_POINTS, 0, coordsList.size() / 3);
}
}
}
3.绘制图片