OpenGL изменяет положение вершины

Я использую простой GLsurfaceview, чтобы нарисовать простой белый квадрат, покрывающий большую часть экрана. при срабатывании OnTouchEvent() квадрат должен расширяться и уменьшаться в соответствии с точкой, нажатой на экране. Это делается путем изменения положения вершин соответственно.

public void onDrawFrame(GL10 gl) {
    // Set GL_MODELVIEW transformation mode
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();   // reset the matrix to its default state
    // When using GL_MODELVIEW, you must set the camera view
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    square.draw(gl, x);
}

Метод Square.draw():

 public void draw(GL10 gl,float x) {
    Log.d("touch", "Square.draw() called");
    vertexBuffer.put(0,-(x/480)*2);
    vertexBuffer.put(6,-(x/480)*2);

    //Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    //Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    //Enable vertex buffer
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    //Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

GlsurfaceView, содержащий onTouchEvent:

public boolean onTouchEvent(MotionEvent e) {
    float x = e.getX();
    mRenderer.x = x;

    requestRender();
    return true;
}

Первоначально я думал, что при каждом нажатии экрана срабатывает onTouchEvent(). Затем я передаю координату x в средство визуализации, а оттуда - в метод рисования, чтобы изменить vertexBuffer. Это, кажется, не работает по двум причинам: 1. как только я покрыл весь экран, нет никакого возвращения назад, где бы я ни нажимал. 2. пункт, который я нажимаю, не переводит хорошо. Я пытался использовать glTranslatef, но, возможно, сделал это неправильно.

Я хотел бы придерживаться этого метода изменения позиций вершин, а не использовать glTranslatef.

1 ответ

Решение

Я предлагаю вам очистить экран перед перерисовкой. Не имеет значения, изменяете ли вы вершины самостоятельно или делаете это при преобразовании (с помощью glTranslate). Вам нужна чистая поверхность для рисования. Добавить

glClear(GL_COLOR_BUFFER_BIT);

в начале функции рисования.

Другие вопросы по тегам