2012-05-04 130 views
4

我使用OpenGL繪製了幾個2D形狀,現在我想添加捏/縮放。我的觀點是透視(頂視圖)。我認爲它是z軸= 0的3D。Android捏/縮放和glfrustum

現在,我應該如何更改glfrustum並在觸摸方法中添加我的活動,以便我可以捏/縮放?

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25); 

我想應該是這樣的

gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom); 

,但應該如何觸摸方法寫入更改做兩個指縮放該縮放參數?

現在問題是rendrer,我在最後添加了縮放方法,但是在縮放方法中,它給了我gl.glfrustum的錯誤,同時onsurfacechanged它不會給我錯誤!我怎麼能解決這個問題?

public class GLrenderer implements Renderer { 
    public GLqueue tri; 
    public GLrenderer() { 
     tri = new GLqueue(); 


    } 


    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(.0f, .0f, .0f, 0f); 
     gl.glClearDepthf(1f); 
    } 


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

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

     //gl.glRotatef(1, 1, 0, 0); 
    // gl.glRotatef(10, 0, 0, 1); 
     tri.draw(gl); 

    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     // TODO Auto-generated method stub 
     gl.glViewport(0, 0, width, height); 
     float ratio = (float) width/height; 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 

     gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25); 
    } 

    public static void zoom(float d2) { 
     // TODO Auto-generated method stub 
      int zoom = (int) (zoom*d2); 

       gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom); 

    } 

    } 

回答

3

如果你有決定了你的變焦一些浮點值,您可以使用此:

glFrustum(left*zoom, right*zoom, bottom*zoom, top*zoom, near, far); 

這裏有一個例子:從OnTouchListener

public boolean onTouch(View v, MotionEvent event) { 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     pointers = 1; 
     return true; 
    case MotionEvent.ACTION_POINTER_2_DOWN: 
     pointers = 2; 
     distance = fingerDist(event); 
     return true; 
    case MotionEvent.ACTION_MOVE: 
     if(pointers == 2){ 
      float newDist = fingerDist(event); 
      float d = distance/newDist; 
      renderer.zoom(d); 
      distance = newDist; 
     } 
     return true; 
    default: 
     return false; 
    } 

    } 

protected final float fingerDist(MotionEvent event){ 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return FloatMath.sqrt(x * x + y * y); 
} 

摘錄來自renderer

public final void zoom(float mult){ 
    zoom *= mult; 
    Matrix.frustumM(
      pMatrix, 0, 
      zoom*left, zoom*right, zoom*bottom, zoom*top, 
      near, far); 
} 

請注意,此代碼是爲gles 2.0而不是1.0編寫的,因此不要致電Matrix.frustumM(),您可以致電gl.glFrustumf()。您可能必須將此操作發佈到您的gl-thread才能正常工作。

+0

你有這樣做的例子嗎?我不知道如何設置觸摸方法做這個和大多數在互聯網上縮放的例子使用縮放而不是相機 – matarsak

+0

基本上'縮放'值是一個縮放因子,雖然它改變了'相機',而不是修改現場。如果你有一個方法可以從夾點計算出一個值,你可以插入它。否則,我可以在回家時發帖子。 – Jave

+0

如果你給我舉一個例子(在變形的平截頭體參數上設置變焦)在一個三角形或任何形狀上,我會很感激。 – matarsak