android - 在 OpenGL ES 中放大/缩小

标签 android opengl-es zooming

我想学习如何进行放大和缩小。这是一个旋转的 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);
    }
}

这是我的 Activity 类,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;
}

最佳答案

从技术上讲,实现相机缩放的正确方法是将参数修改为您的透视投影:

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);

进入你的绘图例程,以便在每一帧调用它们。

关于android - 在 OpenGL ES 中放大/缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009895/

相关文章:

android - 适用于亚马逊设备的谷歌广告 ID

java - 用于在 Android 上比较图像的 OpenGL ES 1.1/2.0 着色器

matlab - 在 MATLAB 中使用 ginput 函数时放大/缩小

android - 在android中添加放大和缩小限制

iphone - uiimageview里面uiscrollview位置不居中

android - 如何更改 TextView 的边距

android - ScrollView 的滚动在 bottomsheet 内不起作用?

android - 在 OpenGL ES 中绘制大量点的最快方法是什么?

android - 在 MALI 400 上让 SurfaceTexture 与 Android Videoplayer 一起工作时出现问题

java - Jsoup ArrayList 和 LinkedHashMap 组合