简体   繁体   English

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

[英]How to redraw opengl renderer after clicking button?

I'm trying to update the gluLookAt() from the main UI thread of my opengl renderer I've tryed the requestRenderer() methode at the end of my code for my button but eclipes gives me sme errors with it I was just wondering what would be the best possible way to do this from the main UI thread? 我正在尝试从我的opengl渲染器的主UI线程更新gluLookAt()我已经在按钮代码的末尾尝试了requestRenderer()方法,但是eclipes给了我sme错误,我只是想知道是什么将是从主UI线程执行此操作的最佳方法?

Heres my MainActivity class: 这是我的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;
    }


}

Here is my Renderer: 这是我的渲染器:

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)

    }



}


}

You're not using your eyez value anywhere in your Renderer . 您不会在Renderer任何地方使用eyez值。

I think you probably want to replace 我想您可能想更换

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

by 通过

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

to actually see any effect from pressing the button. 从按钮实际看到任何效果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM