openGL ES Android 绘制点

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轴

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值