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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
#1

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

25.04.2016, 10:39. Просмотров 351. Ответов 16

Привет всем. Я нарисовал куб, который вращается движение пальца, запустил его, но он постоянно перерисовывается. Как сделать так, чтобы он перерисовывался только когда я двигаю пальцем?
Сделал так:
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;
    }
В таком случае ставится на паузу только после нажатия. При запуске все равно много раз перерисовывается то же самое.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2016, 10:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пауза в обрисовке OpenGL (Программирование Android):

Пауза в цикле - Программирование Android
Народ, научите пожалуйста как сделать паузу в цикле... А то бьюсь бьюсь и ничего не выходит(( Не получаеца сделать паузу после каждой...

Пауза в запросах - Программирование Android
Добрый день Делаю клиент-серверное приложение. Есть такая ситуация: клиент (на Android) должен опрашивать сервер (сейчас на Windows, в...

Таймер. Кнопка "Пауза" - Программирование Android
Вобщем, решил попробовать сделать таймер, нашел статью, вроде все получилось, но есть одно НО. Таймер тикает, нажимаю на стоп,...

Пауза на 7 секунд или пауза до нажатия клавиши - Assembler
Для загрузчика надо сделать паузу, длящуюся 7 секунд, во время которой, если пользователь нажмет клавишу, происходит выход из паузы, или...

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях - Perl
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: ...

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение. - Windows 7
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на видео карту.В разделе программы Repot мне посыпалось куча...

16
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.04.2016, 11:01 #2
у вас в рендере есть переменная из-за которой крутится куб
именно ее надо менять в активити при нажатии и отпускании
0
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
25.04.2016, 11:28  [ТС] #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();
    }
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.04.2016, 11:47 #4
Куб крутится из-за изменения angleX
(чему равен в коде нет)
это изменение надо останавливать в методе onTouchEvent
0
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
25.04.2016, 11:57  [ТС] #5
он и должен крутиться. вопрос в другом. angleX и angleY равны значениям, переданным из onTouchEvent. Это сделано, чтобы куб крутился при движении пальца. Проблема в том, что onDrawFrame постоянно вызывается без остановки. как сделать так, что этот метод вызывался только при движении пальца?
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.04.2016, 12:17 #6
Цитата Сообщение от aydarhub Посмотреть сообщение
только при движении пальца
у него даже в названии метода обозначено что он вызывается при отрисовке
0
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
25.04.2016, 12:19  [ТС] #7
знаете как сделать, чтобы при движении пальца он вызывался?
0
Fulcrum_013
Заблокирован
25.04.2016, 12:30 #8
Цитата Сообщение от aydarhub Посмотреть сообщение
знаете как сделать, чтобы при движении пальца он вызывался?
Вызывать оный onDrawFrame не каждый раз а только при изменении положения объектов, в данном случае куба. Насколько понимаю это идет в рамках какого-то движка/фреймверка, и onDrawFrame делегат обрабатывающий событие отрисовки. Соответсвенно изменения должны быть в коде вызывающем отрисовку. И не только. Тут важно чистит ли вызывающий код буфер каждый кадр. Если чистит то нужно и здесь поменять чтобы очистка и перерисовка была только по событию. Т.е. менять нужно в коде вызывающем onDrawFrame, если он доступен.
0
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
25.04.2016, 12:40  [ТС] #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;
            }
        }
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.04.2016, 12:40 #10
setRenderMode
0
Fulcrum_013
Заблокирован
25.04.2016, 13:07 #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 минуты
Буфера то чистишь и переключаешь ты в своем коде, а не фреймверк, поэтому можно творить в этом плане все что угодно
0
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 26
25.04.2016, 13:14  [ТС] #12
Вы предлагаете внести изменения в метод стандартного класса библиотеки?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ставишь PosChanged=true;
Добавлено через 2 минуты
что то я вообще ничего не понимаю. Извините за тупость, я только начинаю изучать андроид разработку.
0
Fulcrum_013
Заблокирован
25.04.2016, 13:16 #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);
        //.... и далее по тексту
    }
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.04.2016, 13:17 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что происходит при запуске рендерера методом setRenderer? При этом стартует отдельный поток, который вызывает у рендерера метод onDrawFrame. После запуска рендерера нужно определить, как будет производиться отрисовка кадров-автоматически в бесконечном цикле или по команде извне. Режимом смены кадров управляет метод setRenderMode. Если аргументом является RENDERMODE_CONTINUOUSLY то метод onDrawFrame вызывается циклически. Этот режим удобен для анимационных роликов. В другом случае, если в метод setRenderMode передается аргумент RENDERMODE_WHEN_DIRTY, метод onDrawFrame вызывается только один раз при старте рендерера или может быть вызван повторно командой requestRender. Такой режим можно использовать в играх, где требуется вручную управлять сменой кадров, запускать и останавливать анимацию.
для сведения
1
Fulcrum_013
Заблокирован
25.04.2016, 13:22 #15
Цитата Сообщение от aydarhub Посмотреть сообщение
что то я вообще ничего не понимаю. Извините за тупость, я только начинаю изучать андроид разработку.
Та хоть под андроид хоть под машину Бебиджа. Смысл в чем. Раз уж нельзя управлять вызовом отрисовки напрямую (ну типа изменились - тут же вызвал перерисовку, а не по таймеру), заводишь флаг что данные изменились и требуется перерисовка. Соответственно когда куб пальцем двинули флаг взводишь. А отрисовывающий код рисует только при взведенном флаге, и при этом флаг опускает. Сами же отрисованные данные лежат в буфере, и никуда не денутся при переключении буферов. Единственное что возможно придется обеспечить отрисовку в оба буфера при изменении, либо копирование бек-буфера во фронт-буфер после отрисовки (хотя лучше после переключения из фронт в бек),
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2016, 13:22
Привет! Вот еще темы с ответами:

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL? - C++ Qt
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без опен джел имеется вместо него? Тоесть понятно, что в сборке...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности - OpenGL
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL - OpenGL
Продолжая тему с переводом книги http://www.cyberforum.ru/opengl/thread1551398.html Выкладываю для скачивания вторую переведенную главу в...

Ошибки при подключение opengl, немного не связанные с opengl - OpenGL
#include <windows.h> #include "stdafx.h" #include <gl/gl.h> #include <gl/glu.h> #include <stdio.h> //#include "TXLib.h" ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
25.04.2016, 13:22
Ответ Создать тему
Опции темы

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