Android 如何在opengl ES屏幕上在触摸屏上连续绘制点
我想在opengl ES屏幕上连续绘制点,这样看起来就像我在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
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