然后出现了JOGL

也许是最流行的真正的面向对象的编程语言。有许多用去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGl的绑定(Java Bindings for OpenGL), 或者称为JOGL.理由是它得到Sun(Java的创建者)和SGI(OpenGL的创建者)的支持。

如今,Sun的小组正在开发JOGL.它是以肯。拉塞尔和克里斯。克兰开发的Jungle开始的。拉塞尔是Sun的员工,研发“HotSpot虚拟机”,拥有多年的三维经验。克兰则研发“荒谬的游戏”,对三维图形学也相当有经验。

我个人对他们以及所有其它工作在JOGL上的人表示感谢。曾经有许多想通过友好的Java API来使用OpenGL的尝试——其中包括Java 3D, OpenGL for Java Technology (gl4java)(用于Java技术的OpenGL),Lightweight Java Game Library (LWJGL)(轻量级的Java游戏库)。JOGL是第一个使我感到满意的。

JOGL是Sun支持的对于OpenGl的Java类绑定。哇!这句话说得太妙了。

OpenGL被用来展示三维模型。它强大、快速,而且可能是自Swing出现以来最棒的一样东西。通过JOGL来使用OpenGL,你可以制作出很酷的游戏或是模型位置什么的,而在这之前创建它们需要非常昂贵的成本。有人写了很厚很厚的书来描述OpenGL,当你熟悉了它们以后这些书会很有用,但现在不行。你必须学习展现在你面前的OpenGL是如何使用Java API的。同样你还得看一下关于net.java.games.jogl.*的基础介绍,可能还得补习一下数学知识。

获取JOGL?

如果你想使用JOGL,你需要得到jogl.jar以及附带的本机代码。我希望有一天它可以成为Java的标准安装,但现在它只是一个梦想。

第一步是要找到你的操作系统所对应的包,并进行解压缩。我是在上找到的。不同的操作系统有所区别,但需要安装2个部分。系统的classpath里一定要有jogl.jar,而且binary库必须放在和你操作系统的库同一个地方。如果比较幸运的话,安装程序可以为你完成这些。如果你没有安装程序而且不知道该上哪里去寻找关于设置计算机的信息的话,你可以从我提供一个链接Resources开始搜索。我们的第一篇代码是特别用来测试环境是否安装正确的,所以对于测试安装你不必紧张。

JOGL的Javadocs

同样可以在和JOGL 的binary 发布版一样的位置获得Javadocs.Javadocs将会以类似jogl-1.0-usrdoc.tar的名字而命名。

如果你浏览一下net.java.games.jogl包,你很快会注意到有些类非常大。GL便是一个完美的例子。别被这个吓跑了,你很快能发现只需一点点JOGL的知识,你就可以完成一些相当复杂的事了。现在你需要扫视一下的类有:*GLDrawable *GLCanvas *GLJPanel *GLCapabilities *GLDrawableFactory

这些是连接图形世界基本的接口。如果你还记得,前面我提到对于初学OpenGL的人来说,有一个很大的缺点,那就是缺乏窗口系统的标准。对应于C语言,GLUT起到了相当大的作用。而我们则有Swing和AWT(抽象窗口工具箱)。很可能你已经使用过AWT或者Swing了,所以你不会感到自己在从头学起。这是件非常好的事情。在通过了非常简短的关于把JOGL组件放置到屏幕上的介绍以后,我们不需要多长时间就可以运行出一个相当酷而且流行的程序了。

GlueGen……几乎和JOGL一样酷?

你应该意识到,OpenGL是为C程序员而写的。这意味着Java想要利用它,必须要用到本机接口。不那么有趣的JNI(Java本机接口)必须用来进行此连接。OpenGL太大了,手写所有的连接太费时。想稍微做出一点复杂的程序,有许多特别出售的特性,OpenGL则保持改进,那意味着得有相应的变化来跟上OpenGL的步伐。简而言之,对于任何试着写与OpenGL保持同步,包含所有Java到本机的接口的代码的尝试,是非常困难的。

让我们进入JOGL家族看看。他们打算利用C头文件写一些代码来实现一切JNI做的事。他们管这个叫做GlueGen.GlueGen解析C头文件然后魔法般地创建出Java和JNI代码以便连接到本机库。这意味着OpenGL的升级可以迅速地在JOGL里体现。

Hello World!

我是一个很传统的人,所以当然我们将从“你好世界”程序开始。这个“你好世界”程序将检验我们的安装是否全部或者一部分安装正确。回忆一下安装JOGL有2个部分,分别是jar文件里的Java库以及其它库的本机代码。

以下是我们的程序:import net.java.games.jogl.*;public class HelloWorld {   public static void main (String args[]) {      try {         System.loadLibrary("jogl");         System.out.println(            "Hello World! (The native libraries are installed.)"         );        GLCapabilities caps = new GLCapabilities();        System.out.println(            "Hello JOGL! (The jar appears to be available.)"         );      } catch (Exception e) {         System.out.println(e);      }   }}

首先,这个程序测试了本机库和Java库是否已经安装正确了。只有当jogl.jar和本机库(名字诸如libjogl.jnilib或者jogl.dll)两者都安装好了的时候,JOGL才算是安装完全的。如果本机库不可用,程序会抛java.lang.UnsatisfiedLinkError例外。如果classpath里没有安装JAR,程序则根本编译都通不过。Javac编译器会报诸如此类的错“net.java.games.jogl包不存在”。当这个程序编译通过且运行起来没有异常的话,你可以继续学习JOGL了。

一个好的模板当你对JOGL感到思维混乱的时候,让我们来继续看几个类,你可以把它们当成有用的模板来使用。我已经不止一次把它们当成模板用了。你可以随心所欲地使用它们。

这个模板由两个类组成。第一个是如下所示的SimpleJoglApp,第二个是在简短说明之后的SimpleGLEventListener.你必须输入两个类来编译模板。主程序如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;import net.java.games.jogl.*;/**   * This is a basic JOGL app. Feel free to   * reuse this code or modify it.   * 这是个基础的JOGL程序,你可以随意重用该代码或者修改它。   */public class SimpleJoglApp extends JFrame {   public static void main(String[] args) {      final SimpleJoglApp app = new SimpleJoglApp();      // show what we've done      //看一下我们做了什么      SwingUtilities.invokeLater (         new Runnable() {            public void run() {               app.setVisible(true);            }         }      );   }   public SimpleJoglApp() {      //set the JFrame title      //设置JFrame标题      super("Simple JOGL Application");      //kill the process when the JFrame is closed      //当JFrame关闭的时候,结束进程      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      //only three JOGL lines of code …… and here they are      //只有三行JOGL代码 …… 如下      GLCapabilities glcaps = new GLCapabilities();      GLCanvas glcanvas =         GLDrawableFactory.getFactory()。createGLCanvas(glcaps);      glcanvas.addGLEventListener(new SimpleGLEventListener());      //add the GLCanvas just like we would any Component      //像其它组件一样把GLCanvas加入      getContentPane()。add(glcanvas, BorderLayout.CENTER);      setSize(500, 300);      //center the JFrame on the screen      //使JFrame显示在屏幕中央      centerWindow(this);   }   public void centerWindow(Component frame) {      Dimension screenSize =         Toolkit.getDefaultToolkit()。getScreenSize();      Dimension frameSize = frame.getSize();      if (frameSize.width > screenSize.width )         frameSize.width = screenSize.width;      if (frameSize.height > screenSize.height)         frameSize.height = screenSize.height;      frame.setLocation (          (screenSize.width - frameSize.width ) >> 1,          (screenSize.height - frameSize.height) >> 1      );   }}

代码就是这些。让我们把注意力集中在第一个类中与JOGL相关的三行代码上。首先:

这决定了我们的JOGL库和JVM可以使用哪些OpenGL/图形特色。

接着:GLCanvas glcanvas =   GLDrawableFactory.getFactory()。createGLCanvas(glcaps);

我们不能创建GLCanvas或者GLJPanel.我们得用GLDrawableFactory来创建它们。所以我们用GLDrawableFactory的静态方法getFactory()取得了GLDrawableFactory.

现在我们有GLDrawableFactory了。所以我们用createGLCanvas()方法来创建了可以往上画画的GLCanvas.如果我们不需要AWT组件,而是Swing组件,则可以用createGLJPanel()方法。

注意我们把先前创建的GLCapabilities对象传了进去。这可以使我们创建的GLDrawable适当的所创建。

最后,我们准备往GLCanvas上加GLEventListener.

我们对GLEventListener的实现是SimpleGLEventListener.它负责当接到GLDrawable或我们的或只是GLCanvas的调用时,所需要完成的所有绘图工作。你将会看到,我不打算在这个程序里画任何东西。下面是GLEventListener的代码:import java.awt.*;import java.awt.event.*;import net.java.games.jogl.*;/*** For our purposes only two of the* GLEventListeners matter. Those would* be init() and display()。* 为了达到我们的目的,GLEventListener中只有两个方法有用。* 它们是init()和display()。*/public class SimpleGLEventListener implements GLEventListener{   /**    * Take care of initialization here.    * 注意这里的初始化。    */   public void init(GLDrawable drawable) {   }   /**    * Take care of drawing here.    * 注意这里的绘图。    */   public void display(GLDrawable drawable) {   }   /**    * Called when the GLDrawable (GLCanvas    * or GLJPanel) has changed in size. We    * won't need this, but you may eventually    * need it —— just not yet.    * 当GLDrawable(GLCanvas或GLJPanel)大小改变时被调用。    * 我们不需要它,但你可能最后会用到——虽然现在并不需要。    */   public void reshape(                        GLDrawable drawable,                        int x,                        int y,                        int width,                        int height                       ) {}   /**    * If the display depth is changed while the    * program is running this method is called.    * Nowadays this doesn't happen much, unless    * a programmer has his program do it.    * 当程序运行时显示深度被改变的时候此方法被调用。    * 现在这种事发生得不多,除非程序里面触发此事。    */   public void displayChanged(                               GLDrawable drawable,                               boolean modeChanged,                               boolean deviceChanged                             ) {}}

以上就是我们要完成的JOGL核心工作。注意下面的UML图。SimpleJoglApp是一个JFrame.它容纳了GLDrawable,实际上是一个GLCanvas,但不要那样称呼它。我们加入了SimpleGLEventListener.SimpleGLEventListener实现了对于GLCanvas的GLEventListener,这样当它想执行任何的OpenGL 工作的时候,GLCanvas就可以知道。GLDrawables能自动执行,所以你确实得使你的GLEventListener最优化。

这个程序运行起来可能会根据你的操作系统显得有点乱七八糟。这是预料之中的,因为你在这里只是往屏幕上显示随机的内存。所以恭喜你具有了图形创新的才能了。

准备实战

当你熟悉了前面的例子以后,我们来画一张漂亮的图。

这就是你接下来的程序。请确保你输入了所有的代码到你的编辑器中。调试这些程序可以快速地使你明白它们的工作原理。

import java.awt.*;import java.awt.event.*;import javax.swing.*;import net.java.games.jogl.*;/*** This is a basic JOGL app. Feel free to* reuse this code or modify it.* 这是个基础的JOGL程序,你可以随意重用该代码或者修改它。*/public class SecondJoglApp extends JFrame {   public static void main(String[] args) {      final SecondJoglApp app = new SecondJoglApp();      //show what we've done      //看一下我们做了什么      SwingUtilities.invokeLater (         new Runnable() {            public void run() {               app.setVisible(true);            }         }      );   }   public SecondJoglApp() {      //set the JFrame title      //设置JFrame标题      super("Second JOGL Application");      //kill the process when the JFrame is closed      //当JFrame关闭的时候,结束进程      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      //only three JOGL lines of code …… and here they are      //只有三行JOGL代码 …… 如下      GLCapabilities glcaps = new GLCapabilities();      GLCanvas glcanvas =         GLDrawableFactory.getFactory()。createGLCanvas(glcaps);      glcanvas.addGLEventListener(new SecondGLEventListener());            //add the GLCanvas just like we would any Component      //像其它组件一样把GLCanvas加入      getContentPane()。add(glcanvas, BorderLayout.CENTER);      setSize(500, 300);      //center the JFrame on the screen      //使JFrame显示在屏幕中央      centerWindow(this);   }   public void centerWindow(Component frame) {      Dimension screenSize =         Toolkit.getDefaultToolkit()。getScreenSize();         Dimension frameSize = frame.getSize();         if (frameSize.width > screenSize.width )            frameSize.width = screenSize.width;         if (frameSize.height > screenSize.height)            frameSize.height = screenSize.height;          frame.setLocation (          (screenSize.width - frameSize.width ) >> 1,          (screenSize.height - frameSize.height) >> 1         );   }}

请注意这个类对于第一个类所作的改动。改动只有类名、frame名、以及GLEventListener名。希望你能够阅读代码中的注释,否则你会搞不清它要做什么。

我们实现的GLEventListener确实相对于前面一个例子有了一些改进,它允许我们画出一些漂亮的图来。

import net.java.games.jogl.*;/*** For our purposes only two of the GLEventListeners matter.* Those would be init() and display()。* 为了达到我们的目的,GLEventListener中只有两个方法有用。* 它们是init()和display()。*/public class SecondGLEventListener implements GLEventListener{   /**    * Take care of initialization here.    * 注意这里的初始化。    */   public void init(GLDrawable gld) {      GL gl = gld.getGL();      GLU glu = gld.getGLU();      gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);      gl.glViewport(0, 0, 500, 300);      gl.glMatrixMode(GL.GL_PROJECTION);      gl.glLoadIdentity();      glu.gluOrtho2D(0.0, 500.0, 0.0, 300.0);   }   /**    * Take care of drawing here.    * 注意这里的绘图。    */   public void display(GLDrawable drawable) {      float red = 0.0f;      float green = 0.0f;      float blue = 0.0f;      GL gl = drawable.getGL();      gl.glClear(GL.GL_COLOR_BUFFER_BIT);      gl.glPointSize(5.0f);      for (int i=0; i<50; i++) {         red -= .09f;         green -= .12f;         blue -= .15f;      if (red < 0.15) red = 1.0f;      if (green < 0.15) green = 1.0f;      if (blue < 0.15) blue = 1.0f;      gl.glColor3f(red, green, blue);      gl.glBegin(GL.GL_POINTS);         gl.glVertex2i((i*10), 150);      gl.glEnd();   }}public void reshape(                     GLDrawable drawable,                     int x,                     int y,                     int width,                     int height                   ) {}public void displayChanged(                            GLDrawable drawable,                            boolean modeChanged,                            boolean deviceChanged                          ) {}}

以上就是我们第一个有趣的JOGL程序。下图是输出,有很多好看的颜色。

当你看到GLEventListener的实现时,可能会感到不知所措。如果你有用C语言编写OpenGL程序的经验的话,你也许能猜测出一些东西。如果你觉得比较茫然,不必担心,也不要担心我会让你记住这些东西,至少现在不必。本书接下来的篇幅将会对这个例子中的SecondGLEventListener作出解释。现在,你只需要试着去猜测。试着去修改代码,产生两行,或者一行斜的,而不是一行水平线;或是让所有的点都变成蓝色或红色。尽情娱乐,这就是你接下来学习JOGL的方式。

【责编:yuan】

--------------------next---------------------

java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室相关推荐

  1. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  2. java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档

    JAVA 集合JAVA 集合面对浩瀚的网络学习资源,您是否为很难找到适合自己的学习资源而感到苦恼过?那么,您来对地方了.在这里我们帮助大家整理了一份适于轻松学习 Java 文章的清单.JVM 文字太多 ...

  3. java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间

    正文之前 终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事,先写写笔 ...

  4. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  5. java语言就业方向_四大就业方向彻底解决你学习Java语言编程的后顾之忧-生活感悟与随笔 -亦是美网络...

    前面的文章中已经给大家介绍了关于Java编程语言的优势.特点以及就业前景等内容,大家之所以这么热衷于Java编程学习,不仅是因为Java是编程市场上最为广泛流行的语言,大家更关心的是学习了Java编程 ...

  6. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串

    java 字符串 字节数组 Today we will learn how to convert String to byte array in java. We will also learn ho ...

  7. java解析xlsb文件_读取XLSB文件Apache POI的异常java.io.CharConversionException

    我正在开发一种使用Apache POI读取excel xlsb文件的Java应用程序,但是在读取时出现异常,我的代码如下: import java.io.IOException; import jav ...

  8. java小恐龙游戏_【分享】 chrome恐龙小游戏 java

    本帖最后由 leiyanfu 于 2019-5-3 14:27 编辑 最近学习java也有一段时间了 前些天打开网站老是出出现小恐龙所以就萌生了想模仿着写一个 无奈一些东西我还没学到 比如java的窗 ...

  9. c语言与java的最大区别_【干货!!】来看看java和c语言的一些大体区别

    原标题:[干货!!]来看看java和c语言的一些大体区别 对于这两门计算机语言大多数人接触的都不是很多,一般都是到了大学的时候学计算机专业的一些同学才刚接触到c语言这么课程.刚学习的时候会感到非常的陌 ...

最新文章

  1. 微软苹果服务器宕机,苹果服务器宕机,iPhone用户别做这两项操作,微软特斯拉也中招...
  2. 谷歌无人车离奇车祸曝光:人类安全员睡着后,误触关闭了自动驾驶
  3. 中标麒麟mysql导数据_中标麒麟(linux)mysql配置记录
  4. ASP.NET Core微服务(二)——【ASP.NET Core Swagger配置】
  5. 世界上首个被数学证明安全的OS微内核seL4成立基金会
  6. svn: Can't convert string from 'UTF-8' to native
  7. RabbitMQ的Android端接收
  8. Windows Server 2003 来配置网络地址转换 (NAT
  9. 主生产计划 操作教程 用友u8_用友U860_主生产计划用户使用手册.pdf
  10. matlab检验数据异方差,怀特异方差检验方法在matlab中的实现,以及广义最.....
  11. 中国内地最高电影票房收入列表
  12. 基于AHK的键盘映射——高效利用CapsLock键
  13. 积木创意:APP开发需要注意哪些事项?
  14. 读书笔记-人月神话14
  15. 如何提高文献检索能力?
  16. 游泳馆会员管理系统功能图
  17. liunx定时清理运行内存脚本
  18. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
  19. 布袋除尘器过滤风速多少_布袋除尘器过滤风速一般多大
  20. mysql多表联合查询 去重_mysql中的多表联合并且去重排序

热门文章

  1. 小企业仓库管理软件设计开发
  2. 华硕ASUS手机平板官方刷机包raw格式解压修改工具
  3. asp.net实现无刷新ajax技术登录界面
  4. 1080Ti+windows7和1080Ti+windows10的区别
  5. 解决pgAdmin4启动失败方法
  6. 计算机最快接口速度,实测:USB3.1究竟比USB3.0接口快多少?
  7. 2021年我的21个感悟(1/3)
  8. Max-Margin Regularization for Chamfer Matching
  9. 用c语音打一个简单的a+b
  10. IT行业是吃青春饭的吗?