Використання OpenGL в Java

Роман Подобєдов, romka.demonews.com

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

{

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

}

}

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


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

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

Ваш отзыв

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

*

*