单击按钮后如何重绘opengl渲染器?

时间:2013-07-11 04:36:16

标签: java android opengl-es

我正在尝试从我的opengl渲染器的主UI线程更新gluLookAt()我已经在我的代码的末尾尝试了requestRenderer()方法,但eclipes给了我一些错误,我是只是想知道从主UI线程中做到这一点的最佳方法是什么?

继承我的MainActivity课程:

public class MainActivity extends Activity implements OnClickListener {
GLSurfaceView ourSurface;
GLRenderer call;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ourSurface = new SurfaceView(this);
    setContentView(R.layout.activity_main);
    FrameLayout v = (FrameLayout) findViewById(R.id.Canvas);
    v.addView(ourSurface);
}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
    case R.id.pluseyex:
        break;
    case R.id.minuseyex:
      break;    
    case R.id.pluseyey:
        break;
    case R.id.minuseyey:
        break;
    case R.id.pluseyez:
        float z =call.getEyez()+1;
        call.setEyez(z);


        break;
    case R.id.minuseyez:
        break;
    }


}

这是我的渲染器:

public class SurfaceView extends GLSurfaceView {

private final GLRenderer mRenderer;

public SurfaceView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    mRenderer = new GLRenderer();
    setRenderer(mRenderer);
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

public class GLRenderer implements Renderer {

    public volatile float eyez =-5;

      public float getEyez() {
        return eyez;
    }

    public void setEyez(float eyez) {
        this.eyez = eyez;
    }

    private GLTriEX tri;
    //private GLCubeEX cube;
    public GLRenderer(){
        tri = new GLTriEX();
        //cube = new GLCubeEX();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
        // TODO Auto-generated method stub
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(.8f, 0f, .2f, 1f);
        gl.glClearDepthf(1f);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub
        gl.glDisable(GL10.GL_DITHER);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 2, 0);

        //long time = SystemClock.uptimeMillis()% 4000L;
        //float angle =.090f * ((int)time);
        //gl.glRotatef(angle, 1, 0, 2);

        tri.draw(gl);
        //cube.draw(gl);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
        gl.glViewport(0, 0, width, height);//bottom left corrnor
        float ratio = (float) width/height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
        //gl.glFrustumf(left, right, bottom, top, zNear, zFar)

    }



}


}

1 个答案:

答案 0 :(得分:0)

您未在eyez的任何位置使用Renderer值。

我想你可能想要替换

  

GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 2, 0);

通过

  

GLU.gluLookAt(gl, 0, 0, eyez, 0, 0, 0, 0, 2, 0);

通过按下按钮实际看到任何效果。