2013-07-11 60 views
0

我想從我的opengl渲染器的主UI線程中更新gluLookAt()我嘗試了requestRenderer()方法在我的代碼的末尾爲我的按鈕,但eclipes給我sme錯誤,它只是我只是想知道從主用戶界面線程執行此操作的最佳方式是什麼?如何在點擊按鈕後重新繪製opengl渲染器?

繼承人我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) 

    } 



} 


} 

回答

0

你不使用你的Renderer任何地方你eyez值。

我想你也許想

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

更換

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

真正看到從按下按鈕沒有任何影響。

+0

我試過了,但視圖保持不變我添加到GlSurfaceView.sequestered()的調用中,但仍然無效。我也嘗試將onclick()放在GlSurfaceView中,並在按鈕代碼的末尾放置sequestered(),但仍然沒有 –