1、修改MyAbstractRenderer.java 添加旋转功能
public abstract class MyAbstractRenderer implements Renderer {
//围绕x旋转角度
private float xRotate= 0f;
//围绕y旋转角度
private float yRotate= 0f;
public float getxRotate() {
return xRotate;
}
public void setxRotate(float xRotate) {
this.xRotate = xRotate;
}
public float getyRotate() {
return yRotate;
}
public void setyRotate(float yRotate) {
this.yRotate = yRotate;
}
//表层创建
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
//设置清屏色(背景)
gl.glClearColor(0, 0, 0, 1);
//启用顶点缓冲区
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
//表层size改变
public void onSurfaceChanged(GL10 gl, int width, int height) {
//openGL基于状态机
/*单位矩阵
* [1,0,0,0]
* [0,1,0,0]
* [0,0,1,0]
* [0,0,0,1]
*/
this.width =width;
this.height =height;
//视口
gl.glViewport(0, 0, width, height);
//矩阵模式
//透视投影:有深度
//正投影:没有深度
gl.glMatrixMode(GL10.GL_PROJECTION);//(投影矩阵)
//原则:在操作矩阵前先加载单位矩阵 然后才干别的事情
//将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
gl.glLoadIdentity();
//平截头体
//左侧(宽高比),右侧(宽高比),下侧,上侧,近平面、远平面
ratio=(float)width/(float)height;
gl.glFrustumf(-ratio, ratio,-1f, 1f, 3, 7);
//正投影
// gl.glOrthof(-ratio, ratio,-1f, 1f, 3, 7);
}
/*
*绘图
* 在子线程运行
*/
public void onDrawFrame(GL10 gl) {
this.drawBefore(gl);
//模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//eyex,eyey,eyez 放置眼球的坐标
//centerx,centery,ceterz眼球的观察点
//upx,upy,upz 指定眼球向上的向量
GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
//旋转角度
gl.glRotatef(xRotate, 1, 0, 0);
gl.glRotatef(yRotate, 0, 1, 0);
this.draw(gl);
}
/*
* 绘图
* 参数的基本设置
*/
protected void drawBefore(GL10 gl) {
//清除颜色缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//设置绘图的颜色 只要以后没有设置颜色 就一直用这个颜色
gl.glColor4f(1f, 0, 0, 1f);
}
//子类实现绘图的方法
protected abstract void draw(GL10 gl);
}
2、编写点绘制的java文件
//点绘制
public class MyPointRenderer extends MyAbstractRenderer {
@Override
protected void draw(GL10 gl) {
float r =0.5f;
float x =0f;
float y =-1f;
float z =0f;
float alphaStep=(float) (Math.PI/16);
float yStep=0.01f;
float psize=1.5f;
List<Float> list=new ArrayList<Float>();
for(float alpha=0f;alpha<Math.PI*6;alpha+=alphaStep){
x=(float) (r*Math.cos(alpha));
z=(float) (r*Math.sin(alpha));
y+=yStep;
list.add(x);
list.add(y);
list.add(z);
}
ByteBuffer ibb=BufferUtil.list2ByteBuffer(list);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
gl.glPointSize(psize);
gl.glDrawArrays(GL10.GL_POINTS, 0, list.size()/3);
}
}
3、修改MainActivity.java文件
public class MainActivity extends Activity {
//手指按下的点为(x1, y1)手指离开屏幕的点为(x2, y2)
float x1 = 0;
float x2 = 0;
float y1 = 0;
float y2 = 0;
MyAbstractRenderer renderer=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MySurfaceView view=new MySurfaceView(this);
renderer=new MyPointRenderer();
view.setRenderer(renderer);
setContentView(view);
}
//继承了Activity的onTouchEvent方法,直接监听点击事件
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
//当手指按下的时候
x1 = event.getX();
y1 = event.getY();
}
if(event.getAction() == MotionEvent.ACTION_UP) {
float step=5f;
float xRotate=renderer.getxRotate();
float yRotate=renderer.getyRotate();
//当手指离开的时候
x2 = event.getX();
y2 = event.getY();
if(y1 - y2 > 100) {
//向上滑
renderer.setxRotate(xRotate-step);
} else if(y2 - y1 > 100) {
//向下滑
renderer.setxRotate(xRotate+step);
} else if(x1 - x2 > 100) {
//向左滑
renderer.setyRotate(yRotate-step);
} else if(x2 - x1 > 100) {
//向右滑
renderer.setyRotate(yRotate+step);
}
}
return super.onTouchEvent(event);
}
}
运行程序 结果如下图
可以上下左右滑动 旋转x,y轴