Android 如何在opengl ES屏幕上在触摸屏上连续绘制点

Android 如何在opengl ES屏幕上在触摸屏上连续绘制点,android,opengl-es,Android,Opengl Es,我想在opengl ES屏幕上连续绘制点,这样看起来就像我在opengl ES屏幕上绘制对象一样。我使用了onTouchEvent(MotionEvent e)来实现GLSurfaceView类的触摸事件。下面是我的GLSurfaceView和Renderer类 public class MySurfaceView extends GLSurfaceView { private MyRenderer mRenderer; private Utility sPoint; private float

我想在opengl ES屏幕上连续绘制点,这样看起来就像我在opengl ES屏幕上绘制对象一样。我使用了
onTouchEvent(MotionEvent e)
来实现
GLSurfaceView
类的触摸事件。下面是我的GLSurfaceView和Renderer类

public class MySurfaceView extends GLSurfaceView
{
private MyRenderer mRenderer;
private Utility sPoint;
private float xTouchPoint=0.0f;
private float yTouchPoint=0.0f;
public static boolean touchEvent=false;
boolean b=true;
PointF surfacePoints=new PointF();




public MySurfaceView(Context context) {
    super(context);

    //surfacePoints=new PointF();
    setEGLContextClientVersion(1);
    // Set the Renderer for drawing on the GLSurfaceView
    mRenderer = new MyRenderer();
    super.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
    setZOrderMediaOverlay(true);
    setRenderer(mRenderer);
    setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);


}
public boolean onTouchEvent(MotionEvent e) {

    sPoint =  new Utility();
    touchEvent=true;
    xTouchPoint = e.getX();
    yTouchPoint = e.getY();

    sPoint.setCurrentTouchPoint(xTouchPoint,yTouchPoint);
    Log.i("h","Touched (x , y) "+xTouchPoint+" , "+yTouchPoint);
    return true;
}




class MyRenderer implements GLSurfaceView.Renderer {
    private Triangle triangle;
@Override
    public void onDrawFrame(GL10 gl) {

        float viewWidth = (float)getWidth();
        float viewHeigth = (float)getHeight();

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
        gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);

        gl.glLoadIdentity();        //Reset The Current Modelview Matrix
        if(MySurfaceView.touchEvent){
            triangle = new Triangle(sPoint.getCurrentTouchPoint(),viewHeigth,viewWidth);
            Log.i("Hello","Log");
            //triangle=new Triangle(arrayListX,arrayListY, viewHeigth, viewWidth);
            triangle.draw(gl);  
        }

    }
@Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
        if(height == 0) {                       //Prevent A Divide By Zero By
            height = 1;                         //Making Height Equal One
        }

        gl.glViewport(0, 0, width, height);     //Reset The Current Viewport
        gl.glMatrixMode(GL10.GL_PROJECTION);    //Select The Projection Matrix
        gl.glLoadIdentity();                    //Reset The Projection Matrix

        //Calculate The Aspect Ratio Of The Window
        GLU.gluOrtho2D(gl,0,width,0,height);
        gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
        gl.glLoadIdentity();                    //Reset The Modelview Matrix
    }
@Override
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        // TODO Auto-generated method stub

            gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
            gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //Black Background
            gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
            gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
            gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do

            //Really Nice Perspective Calculations
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 



    }

}


public class Triangle {

/** The buffer holding the vertices */
private FloatBuffer vertexBuffer;
private Utility gPoint;
/** The initial vertex definition */


private float vertices[] = { 
             500.0f, 0.0f, 0.0f,    //Top
            /* 500.0f, 250.0f, 0.0f, //Bottom Left
             1000.0f, 0.0f, 0.0f    //Bottom Right*/                                  };


int i=0;

public Triangle(PointF gPoint, float viewHeigth, float viewWidth) {
    vertices[0]=gPoint.x;
    vertices[1]=viewHeigth-gPoint.y;
    Log.i("Utility", gPoint.x+ " , " +gPoint.y);
    ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    vertexBuffer = byteBuf.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);
}

Iterator<Float> itX;
 Iterator<Float> itY;
 float v1[];
public Triangle(ArrayList<Float> arlX,ArrayList<Float> arlY,float viewHeigth, float viewWidth)
{


     int j=0;
     PointF pf=new PointF();

     Log.i("Points","Second   "+arlX.size());
      v1=new float[arlX.size()*3];
     i=arlX.size()*3;


     for (int a = 0; a < arlX.size(); a++)
     {
         v1[j++]=arlX.get(a);
         Log.i("Points","Second12345"+v1[j-1]);
         v1[j++]=arlY.get(a);
         Log.i("Points","Second12345"+v1[j-1]);
         v1[j++]=0.0f;
        Log.i("Points","Second1234567   "+pf.x+","+pf.y);
     }


        ByteBuffer byteBuf = ByteBuffer.allocateDirect(v1.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        vertexBuffer = byteBuf.asFloatBuffer();
        vertexBuffer.put(v1);
        vertexBuffer.position(0);
}

public void draw(GL10 gl) {
    //gl.glScalef(50.0f, 50.0f, 1.0f);
    //Set the face rotation
    gl.glFrontFace(GL10.GL_CCW);

    //Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    //Enable vertex buffer
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    //Draw the vertices as triangle strip

    //gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
    gl.glDrawArrays(GL10.GL_POINTS, 0, i / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}
公共类MySurfaceView扩展了GLSurfaceView
{
私人迈伦德勒;
私人公用事业公司;
专用浮点xTouchPoint=0.0f;
专用浮点数=0.0f;
公共静态布尔touchEvent=false;
布尔b=真;
PointF surfacePoints=新的PointF();
公共MySurfaceView(上下文){
超级(上下文);
//surfacePoints=新点F();
setEGLContextClientVersion(1);
//设置用于在GLSURFACHEVIEW上绘制的渲染器
mrender=新的MyRenderer();
super.setEGLConfigChooser(8,8,8,8,16,0);
setZOrderMediaOverlay(真);
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_);
}
公共事件(运动事件e){
sPoint=新的实用工具();
touchEvent=true;
xTouchPoint=e.getX();
yTouchPoint=e.getY();
sPoint.setCurrentTouchPoint(xTouchPoint,yTouchPoint);
Log.i(“h”,“接触(x,y)”+xTouchPoint+,“+yTouchPoint”);
返回true;
}
类MyRenderer实现GLSurfaceView.Renderer{
私人三角;
@凌驾
公共框架(GL10 gl){
float viewWidth=(float)getWidth();
float viewHeigth=(float)getHeight();
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glColor4f(0.0f,1.0f,0.0f,1.0f);
gl.glLoadIdentity();//重置当前模型视图矩阵
if(MySurfaceView.touchEvent){
三角形=新三角形(sPoint.getCurrentTouchPoint(),viewHeigth,viewWidth);
Log.i(“你好”,“日志”);
//三角形=新三角形(arrayListX、arrayListY、viewHeigth、viewWidth);
三角图(gl);
}
}
@凌驾
表面上的公共空隙已更改(GL10 gl,整型宽度,整型高度){
//TODO自动生成的方法存根
如果(高度==0){//防止被零除以
高度=1;//使高度等于1
}
gl.glViewport(0,0,宽度,高度);//重置当前视口
gl.glMatrixMode(GL10.gl_投影);//选择投影矩阵
gl.glLoadIdentity();//重置投影矩阵
//计算窗口的纵横比
GLU.gluOrtho2D(gl,0,宽度,0,高度);
gl.glMatrixMode(GL10.gl_MODELVIEW);//选择MODELVIEW矩阵
gl.glLoadIdentity();//重置Modelview矩阵
}
@凌驾
已创建曲面上的公共void(GL10 gl、EGLConfig arg1){
//TODO自动生成的方法存根
gl.glShadeModel(GL10.gl_SMOOTH);//启用平滑着色
gl.glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景
gl.glClearDepthf(1.0f);//深度缓冲区设置
gl.glEnable(GL10.gl_DEPTH_TEST);//启用深度测试
gl.glDepthFunc(GL10.gl_LEQUAL);//要执行的深度测试类型
//非常好的透视计算
gl.glHint(GL10.gl\u透视图\u校正\u提示,GL10.gl\u最佳);
}
}
公共阶级三角{
/**保存顶点的缓冲区*/
私有浮动缓冲区顶点缓冲区;
公用事业gPoint;
/**初始顶点定义*/
私有浮动顶点[]={
500.0f,0.0f,0.0f,//顶部
/*500.0f、250.0f、0.0f、//左下角
1000.0f,0.0f,0.0f//右下角*/};
int i=0;
公共三角形(点G点、浮动视图高度、浮动视图宽度){
顶点[0]=gPoint.x;
顶点[1]=视点高度gPoint.y;
Log.i(“实用程序”,gPoint.x+,”+gPoint.y);
ByteBuffer byteBuf=ByteBuffer.allocateDirect(顶点.length*4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer=byteBuf.asFloatBuffer();
vertexBuffer.put(顶点);
顶点缓冲区位置(0);
}
迭代器itX;
迭代性;
浮动v1[];
公共三角形(ArrayList arlX、ArrayList arlY、浮动视图高度、浮动视图宽度)
{
int j=0;
PointF pf=新的PointF();
Log.i(“点”,“秒”+arlX.size());
v1=新浮点[arlX.size()*3];
i=arlX.size()*3;
对于(int a=0;a
您正在使用/尝试的代码的确切问题是什么?您可以分享吗?@Sandstar我必须在屏幕上触摸的地方绘制。因此,我需要在屏幕上触摸的地方绘制连续点。但我无法保留以前的点。我可以使用GLU.gluOrtho2D将点映射到屏幕上触摸的位置(gl,0,宽度,0,高度)C