Chapter 7
Инициализация или как написать приложение с нуля
7.5 Java-апплеты - Magician Library
Достоинством данного типа приложения, конечно же, является переносимость(
для тех платформ, для которых существует плагин)
и незаменимое средство для web-программирования. Вы можете украсить свой
web-сервер апплетами с трехмерной графикой. К вашим услугам все возможности
OpenGL и объектно-ориентированного программирования. Недостатком является
сложность программирования на языке Java. За короткое время(три
месяца) работы с этим языком на меня свалилось очень много элементарых
проблем: отсутствие форматированного ввода/вывода, непонятное поведение
апплета - в разных броузерах по-разному; устаревшие методы, которые одним
компилятором воспринимались нормально, а другой выдавал предупреждение,
и прочие мелкие проблемы. Вообще, писать java-приложения, т.е. самостоятельные
программы, я бы не советовал. Воспользуйтесь альтернативой - OpenGL Auxilary
Library, рассмотренной в самом начале этой главы. Также можно воспользоваться
аналогом GLAUX библиотекой GLUT, о которой пойдет речь ниже.
Если же вам необходимо
переносимое приложение, то возьмите его из примеров к Magician Library.
Для java-апплетов - программ, исполняющихся в web-броузерах, альтернативы
нет. Поэтому я и рассматриваю здесь программирование апплетов. У этого типа приложений
имеются очень серьезные недостатки. Для запуска апплетов требуется плагин размером около двух мегабайт.
Главным образом это связано с тем, что библиотека Magician осуществляет связку между классами Java и
длл-модулями от Silicon Graphics, которые не входят в поставку Windows.
Работают
такие апплеты крайне нестабильно, во всяком случае на момент времени июнь 1999 года, было много проблем.
И самый главный недостаток, эта библиотека платная, если вы хотите распространять ее со своими коммерческими
приложениями, то вам нужно купить лицензию. У меня на сайте находится пробная версия этой библиотеки.
Сейчас вышла еще одна библиотека OpenGL для работы с java-апплетами, она называется
GL4Java. Далее я ее рассмотрю.
Подробно описывать построение java-апплета, я думаю, излишне после рассмотренных здесь трех
примеров приложений. Я лишь приведу здесь свой шаблонный файл template.java с комменариями.
// подключаем стандартные классы
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
//подключаем классы, которые осуществляют связь с opengl.dll и glu.dll
import com.hermetica.magician.*;
import com.hermetica.util3d.*;
public class template extends Applet implements GLEventListener
{
// в этом классе основные функции OpenGL, которые в СИ
// были с приставкой gl
private CoreGL gl_ = new CoreGL();
// в этом классе объявлены функции из glu.dll
private CoreGLU glu_ = new CoreGLU();
// это компонент, на котором отображается окно OpenGL
private GLComponent glc = null;
// размер компонента OpenGL
int width = 500;
public void init()
{
// создаем компонент OpenGL и устанавливаем его в ценре апплета
glc = (GLComponent)GLDrawableFactory.createGLComponent(width, width);
add( "Center", glc );
// устанавливаем пармметры контекста воспроизведения
GLCapabilities cap = glc.getContext().getCapabilities();
cap.setDoubleBuffered(GLCapabilities.DOUBLEBUFFER);
glc.addGLEventListener(this);
// инициализируем и стартуем
glc.initialize();
glc.start();
}
public void initialize( GLDrawable component )
{
float pos[] = {3,3,3,1};
float dir[] = {-1,-1,-1};
// тут префиксы немного другие
gl_.glClearColor( 1.0f, 1.0f, 0.796875f, 1.0f );
gl_.glShadeModel( GL.GL_SMOOTH );
gl_.glEnable(GL.GL_ALPHA_TEST);
gl_.glEnable(GL.GL_DEPTH_TEST);
gl_.glEnable(GL.GL_COLOR_MATERIAL);
gl_.glEnable(GL.GL_LIGHTING);
gl_.glEnable(GL.GL_LIGHT0);
gl_.glEnable(GL.GL_BLEND);
gl_.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
gl_.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, pos);
gl_.glLightfv(GL.GL_LIGHT0, GL.GL_SPOT_DIRECTION, dir);
}
public void reshape( GLDrawable component, int x, int y,
int width, int height)
{
// устанавливаем парамметры сцены
gl_.glViewport( component, 0, 0, height, height);
gl_.glMatrixMode( GL.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.GL_MODELVIEW );
}
public void display( GLDrawable component )
{
gl_.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
// перемещаем сферу
gl_.glTranslated(0.01,0,0);
gl_.glColor3d(0,1,0);
shapes.solidSphere(0.6, 16, 16);
}
public void stop()
{
if(glc.isRunning())
glc.suspend();
}
public void start()
{
if(glc.isRunning())
glc.resume();
}
public void destroy()
{
glc.destroy();
}
public GL getGL()
{
return gl_;
}
}
Исходный файл смотрите здесь.
Html файл здесь.
|