Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Из Википедии — свободной энциклопедии

Java OpenGL (JSR-231)
Скриншот программы Java OpenGL (JSR-231)

Скриншот, демонстрирующий преломление в реальном времени с использованием JOGL на Mac OS X
Тип библиотека
Разработчик JogAmp Community
Написана на Java
 Операционная система  кроссплатформенный
 Аппаратная платформа  Java Virtual Machine
Последняя версия 2.3.2 (10 октября 2015 года)
Тестовая версия 2.4.0
Лицензия 2-пунктная лицензия BSD[d]
Сайт jogamp.org/jogl/w… (англ.)

Java OpenGL (JOGL) — библиотека, представляющая собой прямую привязку функций OpenGL к языку программирования Java. Является эталонной реализацией спецификации JSR-231 (Java Bindings to OpenGL). Отмечена независимым сообществом opengl.org[1] (см. Programming Language Bindings to OpenGL). Изначально библиотека разрабатывалась Кеннетом Бредли Расселом и Кристофером Джоном Клайном, а позже группой Game Technology Group компании Sun Microsystems. В настоящее время является независимым открытым проектом.

JOGL предоставляет программисту доступ ко всем возможностям API OpenGL спецификации 2.0 и ко всем расширениям OpenGL от ведущих производителей[2]. JOGL предоставляет доступ и к двум основным дополнениям OpenGL — ко вспомогательной библиотеке OpenGL (GLU) и к инструментарию разработчика на OpenGL (GLUT) (за исключением возможностей GLUT, связанных с оконной системой, так как Java имеет свою кроссплатформенную высокоуровневую оконную систему AWT и Swing).

Также библиотека JOGL содержит несколько дополнительных классов, не описанных в спецификации JSR-231, служащих для удобства обработки данных для команд OpenGL и связанных с особенностями языка Java (такими как файловый ввод-вывод данных OpenGL, подготовка текстур, подготовка массивов данных для OpenGL).

Решение

JOGL реализует доступ к низкоуровневому API библиотеки OpenGL, написанной на языке Си, посредством интерфейса JNI. Для корректной работы JOGL предполагается, что программное и аппаратное окружение поддерживает OpenGL.

JOGL отличается от других OpenGL оболочек тем, что, по сути, просто предоставляет программисту возможность работать с API OpenGL посредством обращения к командам OpenGL через вызовы соответствующих методов с привычными Java-разработчику типами аргументов, размещённых в нескольких классах, вместо инкапсулирования функциональных возможностей OpenGL в какую-либо объектно-ориентированную парадигму. Действительно, большинство внутреннего кода JOGL сгенерировано автоматически по заголовочным файлам языка Си специальной утилитой Gluegen, специально написанной, чтобы облегчить создание JOGL.

Такое решение имеет свои преимущества и недостатки. Особенности архитектуры OpenGL, представляющего собой, с одной стороны, дискретный автомат, а с другой — процедурный API, не соответствует подходу к программированию на Java . Однако прямое отображение OpenGL API на множество методов Java заметно упрощает перенос уже написанного на Си OpenGL-кода на Java. Малый уровень абстракции JOGL даёт возможность построения довольно эффективных с точки зрения скорости выполнения программ, но вместе с тем усложняет процесс программирования по сравнению с более высокого уровня абстракции и по-настоящему объектно-ориентированными библиотеками-оболочками над OpenGL для Java (например такими, как Java3D). Также, поскольку существенная доля внутреннего кода сгенерирована автоматически, любые изменения в OpenGL (такие как развитие библиотеки или появление новых расширений) могут быть оперативно добавлены в JOGL его разработчиками.

Состояние разработки и стандартизация

По уверениям разработчиков, на 2007 год JOGL поддерживает полный доступ ко всем возможностям спецификации OpenGL 2.0.

Последний стабильный релиз JOGL версии 1.1.0 является эталонной реализацией (англ. reference implementation) JSR-231 (Java Bindings for OpenGL).

Предстоящий релиз 1.1.1 должен будет обеспечить работу с надстройкой GLU NURBS, (рисование кривых линий и поверхностей через стандартный GLU API). Планируется выпустить переработанную спецификацию JSR-231 1.1.1 и добавитьв API JSR-231 точки входа, связанные с NURBS. В версии 2.0.2 предоставляется полный доступ к OpenGL API версий 1.0 — 4.3, а также спецификациям ES 1, ES 2 and ES 3 и почти всем расширениям.

Обзор спецификации JSR-231: сопряжение Java с API OpenGL

Спецификация JSR-231: сопряжение Java с API OpenGL (англ. Java(TM) binding to the OpenGL(R) API), — определяет модель привязки собственной реализации библиотеки OpenGL (реализации под конкретную операционную систему) к языку программирования Java.

Спецификация JSR-231 определяет два пакета:

  • javax.media.opengl — реализует спецификацию ядра OpenGL 2.0 с поддержкой доступных на момент написания JSR-231 расширений OpenGL
  • javax.media.opengl.glu — реализует спецификацию стандартного дополнения GLU 1.3 за исключением GLU NURBS

(В JOGL оба пакета размещены в библиотеке в jar-файле jogl.jar)

Взаимодействие Java 2D и OpenGL

Начиная с Java Standard Edition версии 1.6, Java 2D API и OpenGL могут взаимодействовать посредством JOGL:

Пример построения тетраэдра

3D Tetrahedron Example

Программа показывает пример простейшей отрисовки тетраэдра с использованием JOGL.

Класс JavaRenderer — использует GLAutoDrawable для отрисовки 3D-сцены.

import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.glu.GLU;

public class JavaRenderer implements GLEventListener {
   private float rotateT = 0.0f;
   private static final GLU glu = new GLU();

   public void display(GLAutoDrawable gLDrawable) {
       final GL2 gl = gLDrawable.getGL().getGL2();
       gl.glClear(GL.GL_COLOR_BUFFER_BIT);
       gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
       gl.glLoadIdentity();
       gl.glTranslatef(0.0f, 0.0f, -5.0f);

       gl.glRotatef(rotateT, 1.0f, 0.0f, 0.0f);
       gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);
       gl.glRotatef(rotateT, 0.0f, 0.0f, 1.0f);
       gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);

       gl.glBegin(GL2.GL_TRIANGLES);

       // Front
       gl.glColor3f(0.0f, 1.0f, 1.0f); 
       gl.glVertex3f(0.0f, 1.0f, 0.0f);
       gl.glColor3f(0.0f, 0.0f, 1.0f); 
       gl.glVertex3f(-1.0f, -1.0f, 1.0f);
       gl.glColor3f(0.0f, 0.0f, 0.0f); 
       gl.glVertex3f(1.0f, -1.0f, 1.0f);

       // Right Side Facing Front
       gl.glColor3f(0.0f, 1.0f, 1.0f); 
       gl.glVertex3f(0.0f, 1.0f, 0.0f);
       gl.glColor3f(0.0f, 0.0f, 1.0f); 
       gl.glVertex3f(1.0f, -1.0f, 1.0f);
       gl.glColor3f(0.0f, 0.0f, 0.0f); 
       gl.glVertex3f(0.0f, -1.0f, -1.0f);

       // Left Side Facing Front
       gl.glColor3f(0.0f, 1.0f, 1.0f); 
       gl.glVertex3f(0.0f, 1.0f, 0.0f);
       gl.glColor3f(0.0f, 0.0f, 1.0f); 
       gl.glVertex3f(0.0f, -1.0f, -1.0f);
       gl.glColor3f(0.0f, 0.0f, 0.0f); 
       gl.glVertex3f(-1.0f, -1.0f, 1.0f);

       // Bottom
       gl.glColor3f(0.0f, 0.0f, 0.0f); 
       gl.glVertex3f(-1.0f, -1.0f, 1.0f);
       gl.glColor3f(0.1f, 0.1f, 0.1f); 
       gl.glVertex3f(1.0f, -1.0f, 1.0f);
       gl.glColor3f(0.2f, 0.2f, 0.2f); 
       gl.glVertex3f(0.0f, -1.0f, -1.0f);

       gl.glEnd();

       rotateT += 0.2f;
   }

   public void init(GLAutoDrawable gLDrawable) {
       final GL2 gl = gLDrawable.getGL().getGL2();
       gl.glShadeModel(GL2.GL_SMOOTH);
       gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
       gl.glClearDepth(1.0f);
       gl.glEnable(GL.GL_DEPTH_TEST);
       gl.glDepthFunc(GL.GL_LEQUAL);
       gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT,GL.GL_NICEST);
   }

 public void reshape(GLAutoDrawable gLDrawable, int x, 
   int y, int width, int height) {
       final GL2 gl = gLDrawable.getGL().getGL2();
       if(height <= 0) {
           height = 1;
       }
       final float h = (float)width / (float)height;
       gl.glMatrixMode(GL2.GL_PROJECTION);
       gl.glLoadIdentity();
       glu.gluPerspective(50.0f, h, 1.0, 1000.0);
       gl.glMatrixMode(GL2.GL_MODELVIEW);
       gl.glLoadIdentity();
   }

public void dispose(GLAutoDrawable arg0) {
	
}

}

JavaDia класс—Основной класс отвечающий за вызов выполнение JavaRenderer. Код рисует 3D-сцену в GLCanvas'е.

import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import com.jogamp.opengl.awt.GLCanvas;

public class JavaDia implements Runnable, KeyListener {
    private static Thread displayT = new Thread(new JavaDia());
    private static boolean bQuit = false;

    public static void main(String[] args) {
        displayT.start();
    }

    public void run() {
        Frame frame = new Frame("Jogl 3D Shape/Rotation");
        GLCanvas canvas = new GLCanvas();
        int size = frame.getExtendedState();
        
        canvas.addGLEventListener(new JavaRenderer());
        frame.add(canvas);
        frame.setUndecorated(true);
        size |= Frame.MAXIMIZED_BOTH;
        frame.setExtendedState(size);
        canvas.addKeyListener(this);
        frame.pack();
        frame.setLocationRelativeTo(null);
        
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                bQuit = true;
                System.exit(0);                
            }
        });

        frame.setVisible(true);
        canvas.requestFocus();
        while( !bQuit ) {
            canvas.display();
        }
    }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
       	 displayT = null;
       	 bQuit = true;
            System.exit(0);
        }
    }

    public void keyReleased(KeyEvent e) {
    }

    public void keyTyped(KeyEvent e) {
    }
}

Инсталляция, подключение и использование

Поставка JOGL включает следующие части:

  • Документацию к API.
  • Несколько поставок исполняемого кода библиотеки под различные платформы. Каждая поставка содержит:
    • две бинарные java библиотеки (gluegen-rt.jar и jogl.jar), которые программист должен подключить к исполняемому java-коду. Файлы размещены в подкаталоге lib
    • дополнительные нативные модули — runtime-окружение для исполнения кода библиотек JOGL. Файлы размещены в подкаталоге lib
    • краткое руководство пользователя (файл Userguide.html (англ.)), историю изменений версий JOGL (файл CHANGELOG.txt (англ.)), информацию об авторских правах (файл COPYRIGHT.txt (англ.)), лицензионную информацию (файл LICENSE-JOGL-[сигнатура версии].txt (англ.)), краткие инструкции (файл README.txt (англ.)). Файлы размещены в корневом каталоге библиотеки
  • исходные тексты java-библиотек JOGL
  • общую поставку, содержащую весь бинарный java-код JOGL и все варианты нативного runtime-окружения, предназначенную для приложений архитектуры Java Web Start и java-апплетов
  • бинарный java-код примеров
  • исходный java-код примеров

Каждая часть библиотеки JOGL поставляется в отдельном zip архиве. В имени zip-архива отражено название части, информация о версии JOGL, а также информация о программно-аппаратной платформе, если часть содержит нативные компоненты.

Примечания

  1. [1] Архивная копия от 26 февраля 2011 на Wayback Machine
  2. По информации независимого сообщества opengl.org, см. Programming Language Bindings to OpenGL Архивная копия от 2 ноября 2008 на Wayback Machine

См. также

  • Lightweight Java Game Library (LWJGL) — комплексное решение на основе OpenGL и OpenAL для разработчиков интерактивных мультимедиаприложений, использующих Java
  • OpenGL
  • Java3D

Ссылки

Эта страница в последний раз была отредактирована 4 апреля 2024 в 04:13.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).