Ошибка: Failed to parse the Currency Converter XML document.
$19 222.71


Ошибка: Failed to parse the Currency Converter XML document.
$17 451.35


Ошибка: Failed to parse the Currency Converter XML document.
$2 005.13


Использование 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();
}
}

 

Интересное

FAQ по файлу подкачки
F.A.Q. по файлу подкачки.Ответы на вопросы:-Что такое файл подкачки? -Как определить требуемый объем swap-файла? -Где располагать файл подкачки? -Надо-ли фиксировать максимальный размер файла...
Подробнее...
Разработка эффективной...
Саму идею интернет-торговли нельзя назвать новой. Первые российские интернет-магазины появились еще в конце 90-х годов прошлого века. Многие из них работают по сей день. Многих, к сожалению, давно...
Подробнее...
Введение в технологию SSI
Если вы первый раз слышите о SSI — Server Side Includes, то эта статья как раз для вас. Я не претендую на подробное изложение материала — для этого есть специальная литература.Так вот, на...
Подробнее...
Что такое комплексное...
Услуги по продвижению сайтов в сети Интернет стали в последние годы чрезвычайно популярными. Аудитория Интернета растет быстрыми темпами, многие фирмы обзаводятся сайтами и хотят привлекать на них...
Подробнее...
Собираем Apache + PHP +...
Итак попробуем все это собрать. Для начала нам понадобиться apache, php, sablot, xpat, iconv. Последние три представляют собой программы для обработки XML/XSLT файлов.
Подробнее...
Средства Delphi 7 для...
Рассмотрим наборы компонентов, которые присутствуют в библиотеке компонентов delphi 7, предназначенных для работы с базами данных. Вы узнаете, что такое набор данных, источник данных и...
Подробнее...
Oпасное возвращение червя...
RogueMario.A — это червь, который демонстрирует базовую версию широко известной игры Super Mario. Он делает это для того, чтобы скрыть свою вредоносную деятельность. «Представьте, что...
Подробнее...
Увеличение скорости...
Когда вы соединяетесь с web-узлом, компьютер обменивается с ним информацией. Часть этой информации связана с выяснением IP-адреса узла. Фактически, протокол TCP/IP имеет дело не словами. Каждому...
Подробнее...
Цветной экран смерти
Если ты кодил под Ring 0, то знаешь, что за показ экрана смерти ответственны функции ядра KeBugCheck и KeBugCheckEx.Правда, это реализовано немного по-разному в Windows 2000 и ниже и в Windows XP...
Подробнее...
Наиболее распространенне...
Количество случаев похищения идентификационных данных все растет. Нашла ли ваша организация решение этой проблемы или она остается для вас по-прежнему актуальной? Личные идентификационные данные...
Подробнее...