2012-05-04 8 views
4

OpenGLを使用して複数の2Dシェイプを描画していますが、ピンチ/ズームを追加します。私の見解は視点(上から見たもの)です。Androidのピンチ/ズームとglfrustum

glfrustumを変更して、自分のアクティビティでタッチメソッドを追加してピンチ/ズームできるようにするにはどうすればよいですか?

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

私はそれが

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

のようなものであるべきだと思うが、どのようにタッチ方法は、2つの指ズームを行うため、このズームパラメータを変更するために記述する必要がありますか?

問題がレンダリングされました。私は最後にズームメソッドを追加しますが、ズームメソッドではglglfrustumでエラーが発生しますが、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

あなたがズームを決定し、いくつかのfloat値を持っている場合は、この使用することができます:ここで

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から:

このコードは、1.0ではなくgles 2.0用に書かれているので、Matrix.frustumM()の代わりにgl.glFrustumf()と呼ぶことに注意してください。この操作をglスレッドに正しくポストする必要があります。

+0

これを行う例はありますか?私はこれを行うためにタッチメソッドを設定する方法と、カメラではないスケーリング倍率の例のほとんどを設定していません – matarsak

+0

「ズーム」値はスケーリング係数ですが、変更するのではなく「カメラ」を変更しますシーン。ピンチから値を計算できる方法があれば、それを挿入することができます。それ以外の場合は、私は家に帰るときにスニペットを投稿することができます。 – Jave

+0

三角形やどのような形状であっても、これを行う例(錐台のパラメータを変更してズームを設定する)を私に与えたら、私はとても感謝しています。 – matarsak

関連する問題