【问题标题】:Android pinch/zoom and glfrustumAndroid 捏/缩放和 glfrustum
【发布时间】:2012-05-04 13:24:44
【问题描述】:

我使用OpenGL 绘制了几个二维形状,现在我想添加捏合/缩放。我的观点是透视图(顶视图)。我假设它是 z 轴 = 0 的 3D。

现在,我应该如何更改 glfrustum 并在我的活动中添加触摸方法,以便能够捏/缩放?

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

我觉得应该是这样的

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

但是应该如何编写触摸方法来更改此缩放参数以进行两指缩放?

现在的问题是渲染器,我在最后添加了缩放方法,但是在缩放方法中它给了我 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);

    }

    }

【问题讨论】:

    标签: android opengl-es zooming


    【解决方案1】:

    如果你有一些浮点值来决定你的缩放,你可以使用这个:

    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 编写的,因此您可以调用 gl.glFrustumf(),而不是调用 Matrix.frustumM()。您可能必须将此操作发布到您的 gl-thread 才能使其正常工作。

    【讨论】:

    • 你有这样做的例子吗?我不知道如何设置触摸方法来执行此操作,并且大多数在互联网上缩放的示例都使用缩放而不是相机
    • 基本上zoom 值是一个缩放因子,尽管它改变了“相机”而不是修改场景。如果您有一种可以从捏合计算值的方法,则可以插入该方法。否则我可以在回家后发布一个 sn-p。
    • 如果你给我一个在三角形或任何形状上执行此操作的示例(通过更改截锥体参数设置缩放),我将不胜感激。
    • @matarsak “它不起作用”是什么意思?您收到任何错误消息吗?还是什么都没有发生?正如我所说,您可能必须在您的 gl 线程上运行 glFrustumf() 方法,而不是接受输入的那个。
    • 我在最后的渲染器中添加了该缩放方法。由于这种缩放方法,它给了我 gl.glfrustum 的错误,但在 onSurfaceChanged 方法中,同样的事情没有错误!我不知道如何在此处添加此缩放方法...
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多