Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Java OpenGL


JOGL Refrection Demo Screenshot.png

План:


Введення

Java OpenGL (JOGL) - бібліотека, що представляє собою пряму прив'язку функцій OpenGL до мови програмування Java. Є еталонної реалізацією специфікації JSR-231 (Java Bindings to OpenGL). Відзначено незалежним співтовариством opengl.org (див. Programming Language Bindings to OpenGL). Спочатку бібліотека розроблялася Кеннетом Бредлі Расселом і Крістофером Джоном Клайном, а пізніше групою Game Technology Group компанії Sun Microsystems. В даний час є незалежним відкритим проектом.

JOGL надає програмісту доступ до всіх можливостей API OpenGL специфікації 2.0 і до всіх розширень OpenGL від провідних виробників [1]. JOGL надає доступ і до двох основних доповнень OpenGL - ко допоміжної бібліотеці OpenGL (GLU) і до інструментарію розробника на OpenGL (GLUT) (за винятком можливостей GLUT, пов'язаних з віконною системою, так як Java має свою кроссплатформенную високорівневу віконну систему AWT і Swing).

Також бібліотека JOGL містить кілька додаткових класів, не описаних в специфікації JSR-231, службовців для зручності обробки даних для команд OpenGL і пов'язаних з особливостями мови Java (такими як файловий ввід-вивід даних OpenGL, підготовка текстур, підготовка масивів даних для OpenGL).


1. Рішення

JOGL реалізує доступ до низкорівневому API бібліотеки OpenGL, написаної мовою Сі, за допомогою інтерфейсу JNI. Для коректної роботи JOGL передбачається, що програмне і апаратне оточення підтримує OpenGL.

JOGL відрізняється від інших OpenGL оболонок тим, що, по суті, просто надає програмісту можливість працювати з API OpenGL допомогою звернення до команд OpenGL через виклики відповідних методів із звичними Java-розробнику типами аргументів, розміщених в декількох класах, замість інкапсулювання функціональних можливостей OpenGL в яку -або об'єктно-орієнтовану парадигму. Дійсно, більшість внутрішнього коду JOGL згенеровано автоматично по заголовні файли мови Сі спеціальною утилітою Gluegen, спеціально написаної, щоб полегшити створення JOGL.

Таке рішення має свої переваги і недоліки. Особливості архітектури OpenGL, що представляє собою, з одного боку, дискретний автомат, а з іншого - процедурний API, не відповідає підходу до програмування на Java. Однак пряме відображення OpenGL API на безліч методів Java помітно спрощує перенесення вже написаного на Сі OpenGL-коду на Java. Малий рівень абстракції JOGL дає можливість побудови досить ефективних з точки зору швидкості виконання програм, але разом з тим ускладнює процес програмування в порівнянні з більш високого рівня абстракції і по-справжньому об'єктно-орієнтованими бібліотеками-оболонками над OpenGL для Java (наприклад такими, як Java3D ). Також, оскільки істотна частка внутрішнього коду сгенерирована автоматично, будь-які зміни в OpenGL (такі як розвиток бібліотеки або поява нових розширень) можуть бути оперативно додані в JOGL його розробниками.


2. Стан розробки і стандартизація

За запевненнями розробників, на 2007 рік JOGL підтримує повний доступ до всіх можливостей специфікації OpenGL 2.0.

Останній стабільний реліз JOGL версії 1.1.0 є реалізація специфікації ( англ. reference implementation ) JSR-231 (Java Bindings for OpenGL).

Майбутній реліз 1.1.1 повинен буде забезпечити роботу з надбудовою GLU NURBS, (малювання кривих ліній і поверхонь через стандартний GLU API).

3. Специфікація JSR-231: сполучення Java з API OpenGL

Специфікація JSR-231: сполучення Java з API OpenGL ( англ. Java (TM) binding to the OpenGL (R) API ), - Визначає модель прив'язки власної реалізації бібліотеки OpenGL (реалізації під конкретну операційну систему) до мови програмування Java.

Специфікація JSR-231 визначає два пакети:

  • javax.media.opengl - реалізує специфікацію ядра OpenGL 2.0 з підтримкою доступних на момент написання JSR-231 розширень OpenGL
  • javax.media.opengl.glu - реалізує специфікацію стандартного доповнення GLU 1.3 за винятком GLU NURBS

(В JOGL обидва пакети розміщені в бібліотеці в jar-файлі jogl.jar)


4. Взаємодія Java 2D і OpenGL

Починаючи з Java Standard Edition версії 1.6, Java 2D API і OpenGL можуть взаємодіяти за допомогою JOGL:


5. Приклад побудови тетраедра

6. 3D Tetrahedron Example

Програма показує приклад найпростішої отрисовки тетраедра з використанням JOGL.

Клас JavaRenderer - використовує GLAutoDrawable для відтворення 3D-сцени.

 import  javax.media.opengl.GL  ;  import  javax.media.opengl.GLEventListener  ;  import  javax.media.opengl.GLAutoDrawable  ;  import  javax.media.opengl.glu.GLU  ;  import  java.awt.event.KeyEvent  ;  import  java.awt.event.KeyListener  ;  public  class  JavaRenderer  implements  GLEventListener,  KeyListener  {  private  float  rotateT  =  0.0f  ;  private  static  final  GLU glu  =  new  GLU  (  )  ;  public  void  display  (  GLAutoDrawable gLDrawable  )  {  final  GL gl  =  gLDrawable.  getGL  (  )  ;  gl.  glClear  (  GL.  GL_COLOR_BUFFER_BIT  )  ;  gl.  glClear  (  GL.  GL_DEPTH_BUFFER_BIT  )  ;  gl.  glLoadIdentity  (  )  ;  gl.  glTranslatef  (  0.0f, 0.0f,  -  5.0f  )  ;  gl.  glRotatef  (  rotateT, 1.0f, 0.0f, 0.0f  )  ;  gl.  glRotatef  (  rotateT, 0.0f, 1.0f, 0.0f  )  ;  gl.  glRotatef  (  rotateT, 0.0f, 0.0f, 1.0f  )  ;  gl.  glRotatef  (  rotateT, 0.0f, 1.0f, 0.0f  )  ;  gl.  glBegin  (  GL.  GL_TRIANGLES  )  ;  / / Front  gl.  glColor3f  (  0.0f, 1.0f, 1.0f  )  ;  gl.  glVertex3f  (  0.0f, 1.0f, 0.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 1.0f  )  ;  gl.  glVertex3f  (  -  1.0f,  -  1.0f, 1.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 0.0f  )  ;  gl.  glVertex3f  (  1.0f,  -  1.0f, 1.0f  )  ;  / / Right Side Facing Front  gl.  glColor3f  (  0.0f, 1.0f, 1.0f  )  ;  gl.  glVertex3f  (  0.0f, 1.0f, 0.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 1.0f  )  ;  gl.  glVertex3f  (  1.0f,  -  1.0f, 1.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 0.0f  )  ;  gl.  glVertex3f  (  0.0f,  -  1.0f,  -  1.0f  )  ;  / / Left Side Facing Front  gl.  glColor3f  (  0.0f, 1.0f, 1.0f  )  ;  gl.  glVertex3f  (  0.0f, 1.0f, 0.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 1.0f  )  ;  gl.  glVertex3f  (  0.0f,  -  1.0f,  -  1.0f  )  ;  gl.  glColor3f  (  0.0f, 0.0f, 0.0f  )  ;  gl.  glVertex3f  (  -  1.0f,  -  1.0f, 1.0f  )  ;  / / Bottom  gl.  glColor3f  (  0.0f, 0.0f, 0.0f  )  ;  gl.  glVertex3f  (  -  1.0f,  -  1.0f, 1.0f  )  ;  gl.  glColor3f  (  0.1f, 0.1f, 0.1f  )  ;  gl.  glVertex3f  (  1.0f,  -  1.0f, 1.0f  )  ;  gl.  glColor3f  (  0.2f, 0.2f, 0.2f  )  ;  gl.  glVertex3f  (  0.0f,  -  1.0f,  -  1.0f  )  ;  gl.  glEnd  (  )  ;  rotateT  + =  0.2f  ;  }  public  void  displayChanged  (  GLAutoDrawable gLDrawable,  boolean  modeChanged,  boolean  deviceChanged  )  {  }  public  void  init  (  GLAutoDrawable gLDrawable  )  {  final  GL gl  =  gLDrawable.  getGL  (  )  ;  gl.  glShadeModel  (  GL.  GL_SMOOTH  )  ;  gl.  glClearColor  (  0.0f, 0.0f, 0.0f, 0.0f  )  ;  gl.  glClearDepth  (  1.0f  )  ;  gl.  glEnable  (  GL.  GL_DEPTH_TEST  )  ;  gl.  glDepthFunc  (  GL.  GL_LEQUAL  )  ;  gl.  glHint  (  GL.  GL_PERSPECTIVE_CORRECTION_HINT  , GL.  GL_NICEST  )  ;  gLDrawable.  addKeyListener  (  this  )  ;  }  public  void  reshape  (  GLAutoDrawable gLDrawable,  int  x,  int  y,  int  width,  int  height  )  {  final  GL gl  =  gLDrawable.  getGL  (  )  ;  if  (  height  <=  0  )  {  height  =  1  ;  }  final  float  h  =  (  float  )  width  /  (  float  )  height  ;  gl.  glMatrixMode  (  GL.  GL_PROJECTION  )  ;  gl.  glLoadIdentity  (  )  ;  glu.  gluPerspective  (  50.0f, h,  1.0  ,  1000.0  )  ;  gl.  glMatrixMode  (  GL.  GL_MODELVIEW  )  ;  gl.  glLoadIdentity  (  )  ;  }  public  void  keyPressed  (  KeyEvent  e  )  {  if  (  e.  getKeyCode  (  )  ==  KeyEvent  .  VK_ESCAPE  )  {  JavaDia.  bQuit  =  true  ;  JavaDia.  displayT  =  null  ;  System  .  exit  (  0  )  ;  }  }  public  void  keyReleased  (  KeyEvent  e  )  {  }  public  void  keyTyped  (  KeyEvent  e  )  {  }  } 

JavaDia клас-Основний клас відповідає за виклик виконання JavaRenderer. Код малює 3D-сцену в GLCanvas 'тобто

 import  javax.media.opengl.GLCanvas  ;  import  java.awt.Frame  ;  import  java.awt.event.WindowAdapter  ;  import  java.awt.event.WindowEvent  ;  public  class  JavaDia  implements  Runnable  {  private  static  Thread  displayT  =  new  Thread  (  new  JavaDia  (  )  )  ;  private  static  boolean  bQuit  =  false  ;  public  static  void  main  (  String  [  ]  args  )  {  displayT.  start  (  )  ;  }  public  void  run  (  )  {  Frame  frame  =  new  Frame  (  "Jogl 3D Shape / Rotation"  )  ;  GLCanvas canvas  =  new  GLCanvas  (  )  ;  canvas.  addGLEventListener  (  new  JavaRenderer  (  )  )  ;  frame.  add  (  canvas  )  ;  frame.  setSize  (  640  ,  480  )  ;  frame.  setUndecorated  (  true  )  ;  int  size  =  frame.  getExtendedState  (  )  ;  size  | =  Frame  .  MAXIMIZED_BOTH  ;  frame.  setExtendedState  (  size  )  ;  frame.  addWindowListener  (  new  WindowAdapter  (  )  {  public  void  windowClosing  (  WindowEvent  e  )  {  bQuit  =  true  ;  }  }  )  ;  frame.  setVisible  (  true  )  ;  / / Frame.show ();  canvas.  requestFocus  (  )  ;  while  (  !  bQuit  )  {  canvas.  display  (  )  ;  }  }  } 

7. Інсталяція, підключення та використання

Поставка JOGL включає такі частини:

  • API документацію у форматі javadoc
  • Кілька поставок виконуваного коду бібліотеки під різні платформи. Кожна поставка містить:
    • два бінарні java бібліотеки ( gluegen-rt.jar і jogl.jar), які програміст повинен підключити до виконуваного java-коду. Файли розміщені в підкаталозі lib
    • додаткові нативні модулі - runtime-оточення для виконання коду бібліотек JOGL. Файли розміщені в підкаталозі lib
    • короткий посібник користувача (файл Userguide.html (Англ.) ), Історію змін версій JOGL (файл CHANGELOG.txt (Англ.) ), Інформацію про авторські права (файл COPYRIGHT.txt (Англ.) ), Ліцензійну інформацію (файл LICENSE-JOGL- [сигнатура версии].txt (Англ.) ), Короткі інструкції (файл README.txt (Англ.) ). Файли розміщені в кореневому каталозі бібліотеки
  • вихідні тексти java-бібліотек JOGL
  • загальну поставку, що містить весь бінарний java-код JOGL і всі варіанти нативного runtime-оточення, призначену для додатків архітектури Java Web Start і java-аплетів
  • бінарний java-код прикладів
  • вихідний java-код прикладів

Кожна частина бібліотеки JOGL поставляється розробником в окремому zip архіві. В імені zip-архіву відображено назву частини, інформація про версії JOGL, а також інформація про програмно-апаратній платформі, якщо частина, містить нативні компоненти.


Примітки

  1. За інформацією незалежного спільноти opengl.org, див. Programming Language Bindings to OpenGL - www.opengl.org/resources/bindings/

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
OpenGL
OpenGL ES
OpenGL Shading Language
OpenGL Architecture Review Board
Java
Java Database Connectivity
Java Runtime Environment
Java Virtual Machine
Open Java Interface
© Усі права захищені
написати до нас