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 файл здесь.