知识大全 你好,JOGL - Java与OpenGl的绑定

Posted

篇首语:惜时专心苦读是做学问的一个好方法。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 你好,JOGL - Java与OpenGl的绑定相关的知识,希望对你有一定的参考价值。

你好,JOGL - Java与OpenGl的绑定  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  然后出现了JOGL

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

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

  我个人对他们以及所有其它工作在JOGL上的人表示感谢 曾经有许多想通过友好的Java API来使用OpenGL的尝试——其中包括Java D OpenGL for Java Technology (gl java)(用于Java技术的OpenGL) Ligheight 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的标准安装 但现在它只是一个梦想

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

  JOGL的Javadocs

  同样可以在和JOGL 的binary 发布版一样的位置获得Javadocs Javadocs将会以类似jogl 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有 个部分 分别是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( )       //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 ) >>           (screenSize height frameSize height) >>       )   

  代码就是这些 让我们把注意力集中在第一个类中与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 o 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( )       //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 ) >>           (screenSize height frameSize height) >>          )   

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

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

  import net java games jogl * /*** For our purposes only o 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( f f f f)       gl glViewport( )       gl glMatrixMode(GL GL_PROJECTION)       gl glLoadIdentity()       glu gluOrtho D( )       /**    * Take care of drawing here     * 注意这里的绘图     */   public void display(GLDrawable drawable)       float red = f       float green = f       float blue = f       GL gl = drawable getGL()       gl glClear(GL GL_COLOR_BUFFER_BIT)       gl glPointSize( f)       for (int i= i< i++)          red = f          green = f          blue = f       if (red < ) red = f       if (green < ) green = f       if (blue < ) blue = f       gl glColor f(red green blue)       gl glBegin(GL GL_POINTS)          gl glVertex i((i* ) )       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程序 下图是输出 有很多好看的颜色

  

cha138/Article/program/Java/JSP/201311/19394

相关参考

知识大全 深入理解Java延迟绑定

深入理解Java延迟绑定  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    下面几个类用于确定今

知识大全 你好,我办了张农行信用卡,我取现1000,还款日期是多少啊,一个月后

你好,我办了张农行信用卡,我取现1000,还款日期是多少啊,一个月后信用卡还款首先得绑定本人的借记卡,然后在还款日之前将相应的金额存入借记卡。绑定借记卡后具体信用卡还款方式与期限如下:1、全额还清,则

知识大全 visual studio2008 OpenGL开发配置

visualstudio2008OpenGL开发配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Visual C++中OpenGL编程入门

VisualC++中OpenGL编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Open

知识大全 用Delphi进行OpenGL编程学习心得

用Delphi进行OpenGL编程学习心得  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在开发

知识大全 visual studio2008 OpenGL开发配置方法

visualstudio2008OpenGL开发配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 OpenGL + VS C++ 2010编程环境搭建

OpenGL+VSC++2010编程环境搭建  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文

知识大全 银行卡绑定微信后还可以取钱么?

银行卡绑定微信后还可以取钱么?你好,银行卡绑定微信后,还是可以取钱的。银行卡绑定微信后,银行卡可以正常到银行ATM机或者银行柜台进行取款。银行卡跟qq钱绑定还可以取钱吗?百度一下支付宝,选择官网字样的

知识大全 c# DataGridView数据绑定编程与显示

c#DataGridView数据绑定编程与显示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 MySQL提供与Linux绑定的数据库下载

MySQL提供与Linux绑定的数据库下载  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!MySQL