Використання OpenGL в Java, 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>

*

*