• JOGL


    有许多用Java去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGL的绑定(Java Bindings for OpenGL),或者称为JOGL。

    JOGL的背景

    为了创建一个图形增强的程序,从而出售给使用各种不同操作系统的用户,程序员有一个选择——OpenGL。GL代表图形库(graphics library)。OpenGL是SGI的注册商标。OpenGL显示它是一个跨平台的C语言编程API。但是事实上,在编程接口上,它是一个与硬件无关的规范。

    OpenGL用来制图,速度非常快。大多数情况下,它是硬件加速的。看起来好像OpenGL可以实现一切你想要完成的图形界面。

    然而,OpenGL是为C语言而写的。而C语言不是用来编写复杂应用程序的流行语言。而OpenGL一个最大的缺点是:如果不创建一个窗口(用来把图形放在里面),就什么都做不了(当然,这也是OpenGL的最大优点,它独立于具体的操作系统,语言,甚至是硬件)。而OpenGL没有提供创建窗口的方法。如此使得OpenGL对于初学者来说显得比较困难。

    因此,有了GLUT(OpenGL Utility ToolKit)。它被用来轻松应对窗口、按钮以及用户事件。但是,对于想要使用面向对象方法编程的程序员来说,学习用C或者C++来编写OpenGL程序仍然不是一件简单的事情。

    JOGL

    Java也许是最流行的真正的面向对象的编程语言。有许多用Java去尝试结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGL的绑定——JOGL。因为它得到Sun和SGI的支持。

    OpenGL被用来展示三维模型。它强大、快速,而且可能是自Swing出现以来最棒的一样东西。通过JOGL来使用OpenGL,可以制作出很酷的游戏或者是模型位置等,而在这之前创建它们需要非常昂贵的成本。

    JOGL-获取JOGL

    就是要找到你操作系统所对应的包,并进行解压。

    这个是可以从https://jogl.dev.java.net/找到的,进入网站后点左侧的文档和文件,我下载了Release Builds 2008\JSR-231 1.1.1 - May 22 (15)里面的jogl-1.1.1-windows-i586.zip,解压就得到要的jogl.jar和其他文件了。

     

    JOGL-实例

        

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

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

    JOGL-实例

        

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

    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的方式。

  • 相关阅读:
    UITextField最大字符数和最大字节数的限制
    Python profiling
    Glow Android 优化实践
    当 NSDictionary 遇见 nil
    TCP/IP详解2 学习笔记---mbuf
    行业代码获取最近代码
    词语、句子相似度比较
    从word得到表格数据插入数据库(6位行业代码)
    python遍历数组获取下标
    计算机浮点数表示
  • 原文地址:https://www.cnblogs.com/yxnchinahlj/p/1864375.html
Copyright © 2020-2023  润新知