Основы OpenGL

         

Java-апплеты GL4Java


GL4Java еще одна библиотека, которая связывает классы Java с динамическими модулями opengl32.dll и glu32.dll. Недостатков у этого варианта гораздо меньше, чем у предыдущего. Библиотека имеется под разные платформы. Под Windows имеется инсталлятор. GL4Java работает с динамическими библиотеками OpenGL, которые входят в стандартную поставку Microsoft Windows, в следствие чего необходимый плагин занимает около 200Кб. Маленьким недостатком является требование java-машины версии 5.0.0.3186. Узнать версию вы можете в Internet Explorer'e, меню Ви->Консоль языка Java. GL4Java распространяется бесплатно, последнюю версию вы можете взять на сервере http://www.jausoft.com в разделе Products->GL4Java->Installation. Если этот плагин получит широкое распространение, а у него есть для этого все предпосылки, то написание java-апплетов с использованием OpenGL дело довольно перспективное.

Теперь немного теории о том, как такие библиотеки устроены. Вообще, из Java-апплетов нельзя обращаться к локальному диску пользователя. И тут, у вас может возникнуть вопрос, как же так получается, что из Интернета все-таки можно загрузить апплет и он будет работать с динамическими библиотеками установленными на вашем компьютере? Ведь в одном случае это может быть OpenGL, а в другом - вирус, делающий низкоуровневое форматирование вашего диска и перезаписывающий BIOS. Ответ очень прост, у вас на машине имеются доверительные динамические библиотеки и java-классы, которые с ними взаимодействуют. Просто одних библиотек недостаточно. Из самого java-апплета вы можете загрузить только java-классы на машине пользователя, к которым прописан CLASSPATH. Последним, в свою очередь, разрешено взаимодействовать с динамическими библиотеками. В результате, получается когда вы загружаете java-апплет с использованием OpenGL, то вся графика делается не на уровне виртуальной java-машины, а на уровне opengl32.dll, функционирование которой мало чем отличается от выполнения обычного исполняемого файла. Такие плагины, вообще говоря, являются потенциальной дырой для проникновения в вашу систему из вне. Если вы работаете в многопользовательской операционной системе с разграничением доступа, то не запускайте подозрительных программ от имени администратора. Например, в Unix или WindowsNT, если вы запустите какой-нибудь вирус от имени пользователя, отформатировать жесткий диск ему не удастся, прав у пользователя таких нет. Администраторов лопухов, я здесь не рассматриваю.

Теперь рассмотрим пример. У меня, среди прилагающихся программ, в директории template вы найдете поддиректории 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.*; // код компонента OpenGL, который мы разместим на нашем апплете // компонентами являются кнопки, поля ввода и прочие элементы управления // их программирование очень схоже class BaseGL extends GLAnimCanvas { // в конструктор передаются параметры размеров компонента // w - ширина, h - высота public BaseGL(int w, int h){super(w, h);} // устанавливаем параметр контекста воспроизведения OpenGL // мы будем использовать анимацию и нам понадобится двойная буферизация public void preInit(){doubleBuffer = true;} // устанавливаем параметры сцены public void init() { gl.glMatrixMode(GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(-5,5,-5,5,2,12); glu.gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); gl.glMatrixMode(GL_MODELVIEW); glj.gljCheckGL(); glj.gljMakeCurrent(false); } // функция display выглядит почти также, как и в языке Си // немного другие префиксы команд public void display() { gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl.glRotated(5, 0,0,1); gl.glLineWidth(5); gl.glBegin(GL_LINES); gl.glColor3d(1,0,0); gl.glVertex2d(-2,0); gl.glVertex2d(2,0); gl.glColor3d(0,1,0); gl.glVertex2d(0,-2); gl.glVertex2d(0,2); gl.glColor3d(0,0,1); gl.glVertex3d(0,0,-2); gl.glVertex3d(0,0,2); gl.glEnd(); // этого своего рода аналог auxSwapBuffers glj.gljSwap(); }//display } // теперь код апплета public class BaseApp extends Applet { BaseGL baseGL = null; String gljLib=null; String glLib=null; String gluLib=null; public void init() { // Загружаем библиотеки, которые будут взаимодействовать c opengl32.dll // эти библиотеки находятся на машине пользователя if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false) System.out.println("could not load native libs:"+ gljLib + ", " + glLib + ", " + gluLib); else System.out.println("load native libs:"+ gljLib + ", " + glLib + ", " + gluLib); // устанавливаем алгоритм размещения компонентов на апплете setLayout(null); // устанавливаем размеры самого апплета setSize(570,450); // создаем компоненте OpenGL baseGL = new BaseGL(150,150); // устанавливаем его границы baseGL.setBounds(120,0,450,450); // присоединяем к апплету add(baseGL); } // далее стандартные методы апплета public void start() { baseGL.start(); } public void stop() { baseGL.stop(); } public void destroy(){ baseGL.stop(); baseGL.cvsDispose(); } }

Html-код для запуска данного апплета выглядит следующим образом:

<HTML> <HEAD> <TITLE>Base class for GL4Java</TITLE> </HEAD> <BODY> <applet code="BaseApp.class" width=570 height=450></applet> </BODY> </HTML>



Исходный файл смотрите . Html файл .


Содержание раздела