Chapter 7
Инициализация или как написать приложение с нуля
7.6 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 файл здесь.
|