Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи Web-мастеру » Java - Статьи »

Обсудить на форуме Обсудить на форуме

Использование OpenGL в Java

Принципы реализации OpenGL в Java

В настоящее время 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, а выполняются системой, обращаясь к локальным библиотекам.

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();
 }
}

Может пригодится:


Автор: Роман Подобедов
Прочитано: 2382
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру