我正在尝试从我的 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)
}
}
}