2012-04-04 2 views
2

Я хочу узнать, как выполнять масштабирование и уменьшение. Это простой пример двумерного треугольника, который вращается. Не могли бы вы рассказать мне, как я могу увеличить масштаб и уменьшить масштаб до этого простого примера?увеличить/уменьшить масштаб в OpenGL ES

Должен ли я использовать 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

Технически правильный способ реализации масштабирования камеры, чтобы изменить параметры вашей перспективной проекции:

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

в рутину дро, так что они называются на каждом кадре.

+0

что касается onTouch способ? Я должен использовать это, чтобы иметь возможность масштабировать пальцем – matarsak

+0

, чтобы ваш метод onTouch изменил переменную масштабирования, и изменение будет видно в следующем розыгрыше. –

+1

Как я могу изменить переменную масштабирования? – matarsak

2

Вы можете масштабировать модель через glScalef или переместить камеру. Поскольку масштабирование влияет на все нарисованные объекты, перемещение камеры, вероятно, является лучшим подходом. Вставьте

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

сразу после вызова glLoadIdentity в . Этот должен - не запускал код - результат в перемещении объекта синусоидальный вперед и назад.

Рассмотрите возможность ограничения значения angle на [0.0f;360.0f].

+0

спасибо я бегу, но я хочу, чтобы выполнить масштабирование пальцем не нравится. Я хочу использовать его в своем приложении позже, у которого есть много объектов, и пользователь должен иметь возможность масштабировать и перейти к любому объекту, который ему нужен. – matarsak

+0

_Читать чайные листья_ не был частью моей учебной программы;) GLSurfaceView's [onTouchEvent] (http://developer.android.com/reference/android/view/View.html#onTouchEvent%28android.view.MotionEvent%29) - это то, что вам нужно посмотреть. Примите мой ответ и закройте этот вопрос. –

+1

как я мог это сделать? – matarsak

0

можно рассчитать значение увеличения в вашей onTouch() метод класса активности и использовать его в методе glTranslatef() в onDrawFrame(), как

gl.glTranslatef (0, 0, -zoom); только после того, как glLoadIdentity() ..

Он будет работать ... Дайте мне знать, если вы застряли ...