Форум программистов, компьютерный форум CyberForum.ru

Пауза в обрисовке OpenGL - Android

Восстановить пароль Регистрация
 
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 10:39     Пауза в обрисовке OpenGL #1
Привет всем. Я нарисовал куб, который вращается движение пальца, запустил его, но он постоянно перерисовывается. Как сделать так, чтобы он перерисовывался только когда я двигаю пальцем?
Сделал так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: // нажатие
                glSurfaceView.onResume();
                //...
                break;
            case MotionEvent.ACTION_MOVE: // движение
                glSurfaceView.onResume();
                //...
                break;
            case MotionEvent.ACTION_UP: // отпускание
                glSurfaceView.onResume();
                //...
                break;
        }
        glSurfaceView.onPause();
        return true;
    }
В таком случае ставится на паузу только после нажатия. При запуске все равно много раз перерисовывается то же самое.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2016, 10:39     Пауза в обрисовке OpenGL
Посмотрите здесь:

Android OpenGL 1.1 Android
Пауза в цикле Android
OpenGL ES AndroidNDK Android
OpenGL ES Android
Android OpenGL
Android Пауза в запросах
Android Инициализация OpenGL ES
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 11:01     Пауза в обрисовке OpenGL #2
у вас в рендере есть переменная из-за которой крутится куб
именно ее надо менять в активити при нажатии и отпускании
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 11:28  [ТС]     Пауза в обрисовке OpenGL #3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
        glClearColor(0f, 0f, 0f, 1f);
        glEnable(GL_DEPTH_TEST);
        int vertexShaderId = ShaderUtils.createShader(context, GL_VERTEX_SHADER, R.raw.vertex_shader);
        int fragmentShaderId = ShaderUtils.createShader(context, GL_FRAGMENT_SHADER, R.raw.fragment_shader);
        programId = ShaderUtils.createProgram(vertexShaderId, fragmentShaderId);
        glUseProgram(programId);
        createViewMatrix();
        prepareData();
        bindData();
    }
 
private void bindData(){
        //coords
        aPositionLocation = glGetAttribLocation(programId, "a_Position");
        vertexData.position(0);
        glVertexAttribPointer(aPositionLocation, POSITION_COUNT, GL_FLOAT,
                false, 0, vertexData);
        glEnableVertexAttribArray(aPositionLocation);
 
        //color
        uColorLocation = glGetUniformLocation(programId, "u_Color");
 
        //Matrix
        uMatrixLocation = glGetUniformLocation(programId, "u_Matrix");
    }
 
    private void createViewMatrix() {
        //точка положения камеры
        eyeX = (float) (Math.cos(angleX) * 4f);
        eyeY = 0;
        eyeZ = (float) (Math.sin(angleX) * 4f);
        System.out.println(angleX + " : " + angleY + " : " + angleY1 + " : " + angleY2 + " : " + coordX + " : " + coordY + " : " + x + " : " + y);
 
        //точка направления камеры
        centerX = 0;
        centerY = 0;
        centerZ = 0;
 
        //up-вектор
        upX = 0;
        upY = 1;
        upZ = 0;
 
        Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
    }
 
    private void bindMatrix() {
        Matrix.multiplyMM(mMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
        Matrix.multiplyMM(mMatrix, 0, mProjectionMatrix, 0, mMatrix, 0);
        glUniformMatrix4fv(uMatrixLocation, 1, false, mMatrix, 0);
    }
 
    public void onDrawFrame(GL10 arg0) { // как вызывать этот метод, чтобы он работал только при нажатии?
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        createViewMatrix();
 
        Matrix.rotateM(mViewMatrix, 0, angleY, 1, 0, 0);
        Matrix.rotateM(mViewMatrix, 0, angleY1, 0, 0, 1);
        Matrix.rotateM(mViewMatrix, 0, angleY2, 0, 1, 0);
 
        bindMatrix();
        // оси
        drawAxes();
 
        // cube
        drawCube();
    }
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 11:47     Пауза в обрисовке OpenGL #4
Куб крутится из-за изменения angleX
(чему равен в коде нет)
это изменение надо останавливать в методе onTouchEvent
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 11:57  [ТС]     Пауза в обрисовке OpenGL #5
он и должен крутиться. вопрос в другом. angleX и angleY равны значениям, переданным из onTouchEvent. Это сделано, чтобы куб крутился при движении пальца. Проблема в том, что onDrawFrame постоянно вызывается без остановки. как сделать так, что этот метод вызывался только при движении пальца?
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 12:17     Пауза в обрисовке OpenGL #6
Цитата Сообщение от aydarhub Посмотреть сообщение
только при движении пальца
у него даже в названии метода обозначено что он вызывается при отрисовке
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 12:19  [ТС]     Пауза в обрисовке OpenGL #7
знаете как сделать, чтобы при движении пальца он вызывался?
Fulcrum_013
 Аватар для Fulcrum_013
495 / 611 / 68
Регистрация: 14.12.2014
Сообщений: 4,946
Завершенные тесты: 2
25.04.2016, 12:30     Пауза в обрисовке OpenGL #8
Цитата Сообщение от aydarhub Посмотреть сообщение
знаете как сделать, чтобы при движении пальца он вызывался?
Вызывать оный onDrawFrame не каждый раз а только при изменении положения объектов, в данном случае куба. Насколько понимаю это идет в рамках какого-то движка/фреймверка, и onDrawFrame делегат обрабатывающий событие отрисовки. Соответсвенно изменения должны быть в коде вызывающем отрисовку. И не только. Тут важно чистит ли вызывающий код буфер каждый кадр. Если чистит то нужно и здесь поменять чтобы очистка и перерисовка была только по событию. Т.е. менять нужно в коде вызывающем onDrawFrame, если он доступен.
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 12:40  [ТС]     Пауза в обрисовке OpenGL #9
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Т.е. менять нужно в коде вызывающем onDrawFrame, если он доступен
Этот код недоступен. onDrawFrame является методом стандартного интерфейса Renderer. Вызывается он в стандартном классе BlockingGLTextureView:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void handleMessageLocked(int what) {
            switch (what) {
            case CHANGE_SURFACE:
                if (mEglHelper.createSurface(mSurface)) {
                    mGL = mEglHelper.createGL();
                    mRenderer.onSurfaceCreated(mGL, mEglHelper.mEglConfig);
                }
                break;
            case RESIZE_SURFACE:
                mRenderer.onSurfaceChanged(mGL, mWidth, mHeight);
                break;
            case RENDER:
                mRenderer.onDrawFrame(mGL);
                mEglHelper.swap();
                break;
            case FINISH:
                mEglHelper.destroySurface();
                mEglHelper.finish();
                mFinished = true;
                break;
            }
        }
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 12:40     Пауза в обрисовке OpenGL #10
setRenderMode
Fulcrum_013
 Аватар для Fulcrum_013
495 / 611 / 68
Регистрация: 14.12.2014
Сообщений: 4,946
Завершенные тесты: 2
25.04.2016, 13:07     Пауза в обрисовке OpenGL #11
Ну вот тут делаешь:
Java
1
2
3
4
5
6
7
8
9
//...
case RENDER:
                if (PosChanged){
                     mRenderer.onDrawFrame(mGL);
                    mEglHelper.swap();
                    PosChanged=false;
                 }
                 break
//..
А там где изменяешь позицию ставишь PosChanged=true;

Добавлено через 2 минуты
Буфера то чистишь и переключаешь ты в своем коде, а не фреймверк, поэтому можно творить в этом плане все что угодно
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 13:14  [ТС]     Пауза в обрисовке OpenGL #12
Вы предлагаете внести изменения в метод стандартного класса библиотеки?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ставишь PosChanged=true;
Добавлено через 2 минуты
что то я вообще ничего не понимаю. Извините за тупость, я только начинаю изучать андроид разработку.
Fulcrum_013
 Аватар для Fulcrum_013
495 / 611 / 68
Регистрация: 14.12.2014
Сообщений: 4,946
Завершенные тесты: 2
25.04.2016, 13:16     Пауза в обрисовке OpenGL #13
Цитата Сообщение от aydarhub Посмотреть сообщение
Вы предлагаете внести изменения в метод стандартного класса библиотеки?
Ну можно породить класс а в порожденном переопределить метод реагирующий на это событие, а остальные отдающий предку.
Хотя поскольку буфера чистятся в обработчике а не из фреймверка, в начале следует попробовать сделать вот так:
Java
1
2
3
4
5
6
7
 
public void onDrawFrame(GL10 arg0) { // как вызывать этот метод, чтобы он работал только при нажатии?
        if (!PosChanged) return;
        PosChanged=false;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        //.... и далее по тексту
    }
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 13:17     Пауза в обрисовке OpenGL #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что происходит при запуске рендерера методом setRenderer? При этом стартует отдельный поток, который вызывает у рендерера метод onDrawFrame. После запуска рендерера нужно определить, как будет производиться отрисовка кадров-автоматически в бесконечном цикле или по команде извне. Режимом смены кадров управляет метод setRenderMode. Если аргументом является RENDERMODE_CONTINUOUSLY то метод onDrawFrame вызывается циклически. Этот режим удобен для анимационных роликов. В другом случае, если в метод setRenderMode передается аргумент RENDERMODE_WHEN_DIRTY, метод onDrawFrame вызывается только один раз при старте рендерера или может быть вызван повторно командой requestRender. Такой режим можно использовать в играх, где требуется вручную управлять сменой кадров, запускать и останавливать анимацию.
для сведения
Fulcrum_013
 Аватар для Fulcrum_013
495 / 611 / 68
Регистрация: 14.12.2014
Сообщений: 4,946
Завершенные тесты: 2
25.04.2016, 13:22     Пауза в обрисовке OpenGL #15
Цитата Сообщение от aydarhub Посмотреть сообщение
что то я вообще ничего не понимаю. Извините за тупость, я только начинаю изучать андроид разработку.
Та хоть под андроид хоть под машину Бебиджа. Смысл в чем. Раз уж нельзя управлять вызовом отрисовки напрямую (ну типа изменились - тут же вызвал перерисовку, а не по таймеру), заводишь флаг что данные изменились и требуется перерисовка. Соответственно когда куб пальцем двинули флаг взводишь. А отрисовывающий код рисует только при взведенном флаге, и при этом флаг опускает. Сами же отрисованные данные лежат в буфере, и никуда не денутся при переключении буферов. Единственное что возможно придется обеспечить отрисовку в оба буфера при изменении, либо копирование бек-буфера во фронт-буфер после отрисовки (хотя лучше после переключения из фронт в бек),
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
25.04.2016, 13:39     Пауза в обрисовке OpenGL #16
Цитата Сообщение от aydarhub Посмотреть сообщение
знаете как сделать, чтобы при движении пальца он вызывался
попробуйте
при MotionEvent.ACTION_DOWN
Java
1
glView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
при MotionEvent.ACTION_UP
Java
1
glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2016, 13:46     Пауза в обрисовке OpenGL
Еще ссылки по теме:

Android Кривые в OpenGL SE 1.0
Android Текстура OpenGL es 2
OpenGl ES 2.0 Текстуры Android
Android Комбинирование 2D и 3D в OpenGL ES 2.0
Таймер. Кнопка "Пауза" Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
25.04.2016, 13:46  [ТС]     Пауза в обрисовке OpenGL #17
Цитата Сообщение от Valakin Посмотреть сообщение
для сведения
спасибо. Именно такой ответ я ждал.
Yandex
Объявления
25.04.2016, 13:46     Пауза в обрисовке OpenGL
Ответ Создать тему

Метки
android, opengl es, андроид
Опции темы

Текущее время: 18:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru