3

ズームインとズームアウトの方法を学びたいです。これは、回転する2D三角形の簡単な例です。この簡単な例にズームインおよびズームアウト機能を追加する方法を教えてください。

使用する必要がありますgl.glScalefか?どのように?

public class GLrenderer implements Renderer {
    public GLqueue tri;
    private float angle = 0;

    public GLrenderer() {
        tri = new GLqueue();
    }

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

    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glTranslatef(0, 0, -10);
        gl.glPushMatrix();
        gl.glRotatef(angle, 0, 0, 1);
        tri.draw(gl);
        gl.glPopMatrix();
        angle++;
    }

    @Override
    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);
    }
}

これは私のアクティビティクラスであり、それにonTouchイベントが追加されます。画面に触れたときにズームが機能するようにするには、何を追加する必要がありますか?

GLSurfaceView OurSurface;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    OurSurface = new GLSurfaceView(this);
    OurSurface.setRenderer(new GLrenderer());
    setContentView(OurSurface);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();
    switch (action) {
        case (MotionEvent.ACTION_DOWN): // Touch screen pressed
            break;
        case (MotionEvent.ACTION_UP): // Touch screen touch ended
            break;
        case (MotionEvent.ACTION_MOVE): // Contact has moved across screen
            break;
        case (MotionEvent.ACTION_CANCEL): // Touch event cancelled
            break;
    }
    return super.onTouchEvent(event);
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    OurSurface.onPause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    OurSurface.onResume();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    return false;
}
4

3 に答える 3

6

カメラズームを実装する技術的に正しい方法は、パースペクティブプロジェクションのパラメータを変更することです。

float zoom = 1.5;
// ....
gl.glFrustumf(-ratio/zoom, ratio/zoom, -1/zoom, 1/zoom, 1, 25);

また

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

また

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

どちらがアプリケーションに適しているかによって異なります。

アプリの途中でズームを変更したい場合は、次の行も移動する必要があります。

float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, zoom, 25);

描画ルーチンに追加して、すべてのフレームで呼び出されるようにします。

于 2012-04-05T08:34:35.447 に答える
2

カメラを介してモデルを拡大縮小しglScalefたり、カメラを移動したりできます。ズームはすべての描画オブジェクトに影響するため、カメラを移動することをお勧めします。入れる

gl.glTranslatef(0,0, 5.0f * Math.sin(Math.PI * ((angle % 360.0f)/180.0f)));

glLoadIdentityの呼び出しの直後onDrawFrame。これにより、コードが実行されなかったため、オブジェクトが正弦波状に前​​後に移動するはずです

angleの値をに制限することを検討してください[0.0f;360.0f]

于 2012-04-04T14:28:34.107 に答える
0

ActivityクラスのonTouch()メソッドでズーム値を計算し、onDrawFrame()のglTranslatef()メソッドで次のように使用できます。

gl.glTranslatef(0、0、-zoom); glLoadIdentity()の直後。

それはうまくいくでしょう...あなたが行き詰まったら私に知らせてください...

于 2013-02-19T09:21:22.553 に答える