Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Zoom in/out в JOGL. ничего не понимаю ... ;-) 
V
    Опции темы
kemiisto
Дата 23.1.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Вечер добрый!

Собственно проблема такова. Есть Swing-приложение с GLJFrame. Работаю в NetBeans с OpenGL Pack.
Код

public class App extends JFrame {
    private GLJPanel panel;
    ...
    public App() {
        ...
        panel.addGLEventListener(new JoglEventListener(panel));
        ...
    }
}


В классе JoglEventListener в конструкторе добавляю Listener на прокрутку колёсика:
Код

public class JoglEventListener implements GLEventListener, MouseWheelListener {
    ...
    JoglEventListener(GLJPanel panel) {
        panel.addMouseWheelListener(this);
    }
    ...
}


Теперь хочу zoom'ить при прокрутке колёсика:
Код

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        // тут код
    }

Проблема в том, что если попытаться, что либо сделать с gl в теле этой функции - получаем исключение. Ругается, мол "No OpenGL context current on this thread".

Текущий код smile : 
Код

public class JoglEventListener implements GLEventListener, MouseWheelListener {

    private GL gl;
    private GLU glu = new GLU();
    float h;
    float dist = 5.0f;

    JoglEventListener(GLJPanel panel) {
        panel.addMouseWheelListener(this);
    }

    void drawAxes(GL gl, float size) {
        gl.glBegin(GL.GL_LINES);
        gl.glColor3f(1.0f, 0.0f, 1.0f);
        gl.glVertex3f(-size / 2, 0.0f, 0.0f);
        gl.glVertex3f(size / 2, 0.0f, 0.0f);
        gl.glColor3f(1.0f, 1.0f, 1.0f);
        gl.glVertex3f(0.0f, -size / 2, 0.0f);
        gl.glVertex3f(0.0f, size / 2, 0.0f);
        gl.glVertex3f(0.0f, 0.0f, -size / 2);
        gl.glVertex3f(0.0f, 0.0f, size / 2);
        gl.glEnd();
    }

    void setObserverPos(GLU glu, float r, int theta, int phi) {
        double radianFactor = 2 * 3.1415926535 / 360;
        float eyeX = (float) (r * Math.sin(theta * radianFactor) * Math.cos(phi * radianFactor));
        float eyeY = (float) (r * Math.sin(theta * radianFactor) * Math.sin(phi * radianFactor));
        float eyeZ = (float) (r * Math.cos(radianFactor * theta));
        glu.gluLookAt(eyeX, eyeY, eyeZ, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    }

    GLUquadric drawNucleus(GLU glu, GL gl, int mass, float x, float y, float z) {
        gl.glColor3f(1.0f, 0.0f, 1.0f);
        gl.glTranslatef(0.0f, 0.0f, 0.0f);
        gl.glTranslatef(x, y, z);
        GLUquadric quadric = glu.gluNewQuadric();
        float r = (float) (Math.log10(mass) + 1) / 10;
        glu.gluSphere(quadric, r, 32, 32);
        return quadric;
    }

    @Override
    public void init(GLAutoDrawable drawable) {
        // Use debug pipeline
        // drawable.setGL(new DebugGL(drawable.getGL()));

        gl = drawable.getGL();
        System.err.println("INIT GL IS: " + gl.getClass().getName());

        // Enable VSync
        gl.setSwapInterval(1);

        // Setup the drawing area and shading mode
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glShadeModel(GL.GL_SMOOTH); // try setting this to GL_FLAT and see what happens.
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        // Clear the drawing area
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        // Reset the current matrix to the "identity"
        gl.glLoadIdentity();

        // Move the "drawing cursor" around
        gl.glTranslatef(0.0f, 0.0f, -10.0f);

        gl.glPushMatrix();
        //
        setObserverPos(glu, dist, 45, 45);

        // Draw axes
        drawAxes(gl, 10.0f);

        drawNucleus(glu, gl, 217, -3.0f, 1.0f, -3.0f);
        drawNucleus(glu, gl, 1, 3.0f, 1.0f, 2.0f);

        gl.glPopMatrix();

        // Flush all drawing operations to the graphics card
        gl.glFlush();
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
        if (height <= 0) { // avoid a divide by zero error!
            height = 1;
        }
        h = (float) width / (float) height;
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, h, 1.0, 20.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int n = e.getWheelRotation();
        System.out.println(Integer.toString(n)); // "отладка для бедных"
        // просто пример, тут и происходит исключительная ситуация
        glu.gluPerspective(65.0f, h, 1.0, 20.0); // как я где-то видел, для zoom'а можне менять угол, 
    }
}


Была также сделано попытка: объявил переменную private GLContext glContext, в методе init инициализировал её glContext = drawable.getContext(), а потом в mouseWheelMoved вызываю glContext.setCurrent(). Исключения не генерируется, но ничего не происходит.

 smile Не пинайте сильно, если что не так...

Это сообщение отредактировал(а) kemiisto - 23.1.2009, 00:34


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ivg
Дата 23.1.2009, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 4
Всего: 81



GL и GLU в методах реализующих интерфейс GLEventListener получаете:
Код

    GL gl = drawable.getGL();
    GLU glu = new GLU();
 только в таком случае они "действительны". Ну а в обработчиках событий мыши/клавиатуры и т. п. просто подготавливаете(изменяете) поле класса, которое потом в методах GLEventListener'а будет использовано для отрисовки. Допустим к вашему примеру, может выглядеть так:
Код

    public void mouseWheelMoved(MouseWheelEvent e) {
        int n = e.getWheelRotation();
        System.out.println(this.dist); // "отладка для бедных"
        this.dist = Math.abs(this.dist + (float)n/2);
    }

PM MAIL   Вверх
kemiisto
  Дата 23.1.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



ivg, переписал пока вот так:
Код

public class JoglEventListener implements GLEventListener, MouseWheelListener {

    float r = 5.0f;
    int theta = 45;
    int phi = 45;

    JoglEventListener(GLJPanel panel) {
        panel.addMouseWheelListener(this);
    }

    void drawAxes(GL gl, float size) {
        gl.glBegin(GL.GL_LINES);
        gl.glColor3f(1.0f, 0.0f, 1.0f);
        gl.glVertex3f(-size / 2, 0.0f, 0.0f);
        gl.glVertex3f(size / 2, 0.0f, 0.0f);
        gl.glColor3f(1.0f, 1.0f, 1.0f);
        gl.glVertex3f(0.0f, -size / 2, 0.0f);
        gl.glVertex3f(0.0f, size / 2, 0.0f);
        gl.glVertex3f(0.0f, 0.0f, -size / 2);
        gl.glVertex3f(0.0f, 0.0f, size / 2);
        gl.glEnd();
    }

    GLUquadric drawNucleus(GLU glu, GL gl, int mass, float x, float y, float z) {
        gl.glColor3f(1.0f, 0.0f, 1.0f);
        gl.glTranslatef(0.0f, 0.0f, 0.0f);
        gl.glTranslatef(x, y, z);
        GLUquadric quadric = glu.gluNewQuadric();
        float r = (float) (Math.log10(mass) + 1) / 10;
        glu.gluSphere(quadric, r, 32, 32);
        return quadric;
    }

    @Override
    public void init(GLAutoDrawable drawable) {
        // Use debug pipeline
        // drawable.setGL(new DebugGL(drawable.getGL()));
        GL gl = drawable.getGL();
        System.err.println("INIT GL IS: " + gl.getClass().getName());

        // Enable VSync
        gl.setSwapInterval(1);

        // Setup the drawing area and shading mode
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glShadeModel(GL.GL_SMOOTH); // try setting this to GL_FLAT and see what happens.
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();
        GLU glu = new GLU();

        // Clear the drawing area
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        // Reset the current matrix to the "identity"
        gl.glLoadIdentity();

        // Move the "drawing cursor" around
        gl.glTranslatef(0.0f, 0.0f, -10.0f);

        gl.glPushMatrix();

        double radianFactor = 2 * 3.1415926535 / 360;
        float eyeX = (float) (r * Math.sin(theta * radianFactor) * Math.cos(phi * radianFactor));
        float eyeY = (float) (r * Math.sin(theta * radianFactor) * Math.sin(phi * radianFactor));
        float eyeZ = (float) (r * Math.cos(radianFactor * theta));
        glu.gluLookAt(eyeX, eyeY, eyeZ, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

        // Draw axes
        drawAxes(gl, 10.0f);

        drawNucleus(glu, gl, 217, -3.0f, 1.0f, -3.0f);
        drawNucleus(glu, gl, 1, 3.0f, 1.0f, 2.0f);

        gl.glPopMatrix();

        // Flush all drawing operations to the graphics card
        gl.glFlush();
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
        GL gl = drawable.getGL();
        GLU glu = new GLU();

        if (height <= 0) { // avoid a divide by zero error!
            height = 1;
        }
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 20.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int n = e.getWheelRotation();
        System.out.println(Integer.toString(n));
        this.r = Math.abs(this.r + (float)n/2);
    }
}

Не работает. Изменения то происходят, но они не отображаются до тех пор, пока явно не заставить отрисоваться сцену (например, изменить размеры окна). smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ivg
Дата 23.1.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 4
Всего: 81



В конструкторе, сохраняйте ссылку на панель в поле класса, а в обработчике мыши вызывайте на ней repaint().
PM MAIL   Вверх
kemiisto
  Дата 23.1.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



ivg, user posted image


--------------------
PM MAIL WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.