当前位置: 代码迷 >> Android >> android平台用OpenGL ES绘制图像的移动解决办法
  详细解决方案

android平台用OpenGL ES绘制图像的移动解决办法

热度:14   发布时间:2016-05-01 21:31:47.0
android平台用OpenGL ES绘制图像的移动
我画了个简单的线段,想要隔一两秒中这个线段就的位置就变一下。不知道怎么实现。
1.OpenglActivity.java 主activity

public class OpenglActivity extends Activity {
private GLSurfaceView view;

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   
  /* 创建一个 GLSurfaceView 用于绘制表面 */
  view = new MyView(this);
 
  /* 将创建好的 GLSurfaceView 设置为当前 Activity 的内容视图 */
  setContentView(view);
  }
}

2.MyView.java 
public class MyView extends GLSurfaceView{
private GridRender myrender;

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

myrender = new GridRender(context);

  /* 设置 Renderer 用于执行实际的绘制工作 */
  setRenderer(myrender);
 
  /* 设置绘制模式为 持续绘制 */
  setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
  // setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}

3.GridRender.java 
private MyLine myline;

public GridRender(Context context)
{
myline = new MyLine();
}

public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

myline.draw(gl);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
  OnSurfaceChanged 和OnSurfaceCreated省略。

4.MyLine.java
public class MyLine {
  private FloatBuffer mVertexBuffer;
  private float[] data = {
  1,0,1,
2,0,1
  };
private int num = 5;

public MyLine()
{
ByteBuffer vbb = ByteBuffer.allocateDirect(data.length*4);
  vbb.order(ByteOrder.nativeOrder());
  mVertexBuffer = vbb.asFloatBuffer();
  mVertexBuffer.put(data);
  mVertexBuffer.position(0);
}

public void draw(GL10 gl){
 
  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  

  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

  gl.glDrawArrays(GL10.GL_LINES, 0, 2);  
  }
}

曾经试着在draw函数里面加一个update函数。意思是每次画完都更新一下data数组里面的坐标。但是不行。

望不吝赐教,谢谢!

------解决方案--------------------
可以在onDrawFrame里面用gl.glTranslatef(x, y, z)更新当前坐标
------解决方案--------------------
看不出啥问题,估计是越界了,默认的范围是-1到1,,你用float处理看看,写一个循环加减的,,或者先在draw里面写一个log。,。,看看 是不是一直在调用
------解决方案--------------------
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY)
...去掉或者改用GLSurfaceView.RENDERMODE_CONTINUOUSLY试试
  相关解决方案