Использование OpenGL в Java
Роман Подобедов, romka.demonews.com
В настоящее время Java очень широко распространена и все больше и
больше различных технологий переносятся на этот язык. Не исключением
является и OpenGL. OpenGL дополняет Java таким образом, что перспективные
технологии 3D графики становятся реальностью при написании апплетов для
WEB с помощью Java. OpenGL реализован в Java посредством дополнительных
расширений и библиотек. Существует несколько видов этих библиотек, все они
выпускаются различными небольшими компаниями. Коммерческие библиотеки я
рассматривать не буду, а рассмотрю самую распространенную и самое главное
бесплатную (GNU лицензия) библиотеку GL4Java (Ее можно взять по адресу
http://www.jausoft.com). Кроме того, эта библиотека имеет меньше всего
недостатков и вдобавок к этому существует практически под все операционные
системы. Поэтому далее мы будем рассматривать именно эту библиотеку.
Хоть Java и OpenGL являются мультиплатформенными, GL4Java
устанавливается на различные платформы по разному. GL4Java является
связующим элементом между Java и конкретной реализацией OpenGL на данной
платформе. Например в Windows OpenGL реализован через динамическую
библиотеку opengl32.dll и GL4Java позволяет обращаться из Java апплетов к
функциям этой библиотеки. Конечно для каждой конкретной операционной
системы существуют библиотеки GL4Java, откомпилированные именно под
эту операционную систему.
Но существует небольшая хитрость. Так как в Java апплетах запрещено
использование локальных файлов пользователя, то возникает вопрос, каким
образом программа на Java обращается к динамическим библиотекам Windows?
Сделано это таким образом, что в GL4Java имеются специальные библиотеки
(называемые wrapper библиотеками, т.е. находящимися между Java и OpenGL
библиотеками), к которым возможно обращение из Java апплетов. Таким
образом через эти библиотеки происходит уже непосредственное обращение к
библиотекам OpenGL. Еще одной особенностью такой реализации является то,
что скорость работы Java апплета сравнима со скоростью стандартных OpenGL
программ, написанных например на C/C++, так как OpenGL команды
обрабатываются не в интерпретаторе Java, а выполняются системой, обращаясь
к локальным библиотекам.
Построение апплета мало чем отличается от стандартного. Рассмотрим на
примере, приведенном ниже.
Класс MainApp - это основной класс апплета, наследуемый от класса
Applet. Класс MainGL наследуется от специального класса GLAnimCanvas,
который определен в библиотеке GL4Java. От этого класса должны
наследоваться классы, которые отвечают за рисование на поверхности OpenGL
апплета. GLAnimCanvas унаследован от класса GLCanvas и является его
расширением, добавляя поддержку потоков для анимации. В основном
большинство OpenGL апплетов используют именно этот класс.
Рассмотрим теперь, какие основные методы (которые необходимы для работы
OpenGL программы) можно переопределять в своем классе и для чего они
нужны.
public void preInit() - Вызывается до того как создается OpenGL
контекст. Обычно используется для установки параметров OpenGL, например
использование двойной буфферизации.
public void init() - Вызывается после того, как создается OpenGL
контекст. Тут можно вызывать команды установки проекции OpenGL и другие
команды по инициализации.
public void display() - Это метод, который вызывается для того, чтобы
перерисовать содержимое на поверхности для рисования. В данном примере он
вызывается автоматически, но его можно вызывать и самостоятельно. В этом
методе вызываются команды OpenGL, отвечающие за рисование.
Это в принципе и все, что нужно знать. Подробную информацию, а также
дополнительные методы смотрите в документации по GL4Java.
Процесс написания OpenGL программы на Java, мало чем отличается от
программы на C/C++. Единственное, что хочу отметить, это то, что перед
OpenGL командой надо ставить "gl." (gl с точкой), соответственно перед
командой из GLU библиотеки "glu." и т.д.
Далее я привожу пример (скелет) апплета на Java, использующего
OpenGL.
// Подключаем библиотеки GL4Java
import gl4java.GLContext;
import gl4java.awt.GLCanvas;
import gl4java.awt.GLAnimCanvas;
// Подключаем стандартные библиотеки Java
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.applet.*;
// Наш основной класс GL
class MainGL extends GLAnimCanvas
{
// Конструктор
public MainGL(int w, int h)
{
super(w, h);
}
// Преинициализация
public void preInit()
{
doubleBuffer = true; // Устанавливаем двойную буфферизацию
}
// Инициализация. Устанавливаем OpenGL проекции
public void init()
{
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(-5.0, 5.0, -5.0, 5.0, 2.0, 50.0);
gl.glMatrixMode(GL_MODELVIEW);
gl.glTranslatef(0, 0, -5);
glj.gljCheckGL();
glj.gljMakeCurrent(false);
gl.glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
// Функция рисования.
public void display()
{
if (glj.gljMakeCurrent() == false) return;
// Если есть какие то проблемы с OpenGL, то выходим
// Тут идет стандартный поток OpenGL комманд
gl.glClear(GL_COLOR_BUFFER_BIT);
// ... OpenGL команды ...
glj.gljSwap(); // Отображаем буффер на экран (при двойной буфферизации)
}
}
// Основной класс апплета
public class MainApp extends Applet
{
MainGL glmain = null;
// Инициализация апплета
public void init()
{
setLayout(null);
setSize(640,480); // Размер апплета
glmain = new MainGL(640, 480); // Создаем наш GL объект
glmain.setBounds(0,0,640,480); // Устанавливаем параметры для него
add(glmain); // И добавляем его к нашему апплету
}
// Эта функция вызывается тогда, когда апплет стартует
public void start()
{
glmain.start();
}
// Эта функция вызывается тогда, когда апплет останавливается
public void stop()
{
glmain.stop();
}
// Эта функция вызывается тогда, когда апплет уничтожается
public void destroy()
{
glmain.stop();
glmain.cvsDispose();
}
}
|