www.codenet.ru
Роман Подобедов
Принципы реализации
OpenGL в Java
В настоящее время Java
очень широко распространена и все больше и больше
различных технологий переносятся на этот язык. Не
исключением является и OpenGL. OpenGL дополняет Java
таким образом, что перспективные технологии 3D графики
становятся реальностью при написании апплетов для WEB с
помощью Java. OpenGL реализован в Java посредством
дополнительных расширений и библиотек. Существует
несколько видов этих библиотек, все они выпускаются
различными небольшими компаниями. Коммерческие
библиотеки я рассматривать не буду, а рассмотрю самую
распространенную и самое главное бесплатную (GNU
лицензия) библиотеку GL4Java (Ее можно взять по адресу
http://r.codenet.ru/?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, а выполняются системой, обращаясь к
локальным библиотекам.
2. Построение Java
апплета с использованием OpenGL
Построение апплета мало
чем отличается от стандартного. Рассмотрим на примере,
приведенном ниже.
Класс 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()
{
// Если есть какие то проблемы с OpenGL, то выходим
if (glj.gljMakeCurrent() == false) return;
// Тут идет стандартный поток 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); // Размер апплета
// Создаем наш GL объект
glmain = new MainGL(640, 480);
// Устанавливаем параметры для него
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();
}
}