Принципи реалізації 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();
}
}

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*