Open GL

         

Java-апплеты - Magician Library


Достоинством данного типа приложения, конечно же, является переносимость( для тех платформ, для которых существует плагин) и незаменимое средство для web-программирования. Вы можете украсить свой web-сервер апплетами с трехмерной графикой. К вашим услугам все возможности OpenGL и объектно-ориентированного программирования. Недостатком является сложность программирования на языке Java. За короткое время(три месяца) работы с этим языком на меня свалилось очень много элементарых проблем: отсутствие форматированного ввода/вывода, непонятное поведение апплета - в разных броузерах по-разному; устаревшие методы, которые одним компилятором воспринимались нормально, а другой выдавал предупреждение, и прочие мелкие проблемы. Вообще, писать java-приложения, т.е. самостоятельные программы, я бы не советовал. Воспользуйтесь альтернативой - OpenGL Auxilary Library, рассмотренной в самом начале этой главы. Если же вам необходимо переносимое приложение, то возьмите его из примеров к Magician Library. Для java-апплетов - программ, исполняющихся в web-броузерах, альтернативы нет. Поэтому я и рассматриваю здесь программирование апплетов. У этого типа приложений имеются очень серьезные недостатки. Для запуска апплетов требуется плагин. Работают такие апплеты крайне нестабильно, во всяком случае на момент времени июнь 1999 года было много проблем. Сейчас вышла еще одна библиотека OpenGL для работы с java-апплетами, она называется GL4Java. Далее я ее рассмотрю.
Комметировать java-код, я думаю, излишне после рассмотренных здесь трех примеров приложений. Я лишь приведу здесь свой шаблонный файл template.java.

import java.applet.*; import java.awt.*; import java.awt.event.*; import com.hermetica.magician.*; import com.hermetica.util3d.*; public class template extends Applet implements GLEventListener { private CoreGL gl_ = new CoreGL(); private CoreGLU glu_ = new CoreGLU(); private GLComponent glc = null; FrameRateComponent frc = new FrameRateComponent(); final int width = 400; public void init() { glc = (GLComponent)GLDrawableFactory.createGLComponent(width, width); add( "Center", glc ); /** Setup the context capabilities */ GLCapabilities cap = glc.getContext().getCapabilities(); cap.setDepthBits(12); cap.setPixelType(GLCapabilities.RGBA); cap.setColourBits(24); cap.setRedBits(1); cap.setDoubleBuffered(GLCapabilities.DOUBLEBUFFER); frc.setSummaryOnly(true); /** Register the GLEventListener with the GLComponent */ glc.addGLEventListener(this); /** Initialize the component */ glc.initialize(); glc.start(); setSize(width,width); } public int getWidth() { return width; } public int getHeight() { return width; } /** Initialization stuff */ 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); } /** Handles viewport resizing */ public void reshape( GLDrawable component, int x, int y, int width, int height) { /** Setup the viewport */ gl_.glViewport( component, x, y, width, 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 ) { frc.startSample(); gl_.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); gl_.glTranslated(0.01,0,0); gl_.glColor3d(1,0,0); shapes.solidSphere(0.6, 16, 16); frc.stopSample(); } 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_; } }


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



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