<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    [轉(zhuǎn)]你好,JOGL - Java與OpenGl的綁定

    來源:賽迪博客
    http://java.ccidnet.com/art/297/20060320/483789_1.html

    在這篇文章里,摘錄了《學習Java對于OpenGl的綁定》。作者吉恩戴維斯解釋了如何開始用Java對于OpenGl的綁定開發(fā)圖形增強的程序

    這些年來,為了創(chuàng)建一個圖形增強的程序,從而出售給使用各種不同操作系統(tǒng)的用戶,程序員有一個選擇——OpenGL。GL代表圖形庫(graphics library)。OpenGL是SGI(美國圖形工作站生產(chǎn)廠商)的注冊商標。OpenGL顯示了它是一個跨平臺的C語言編程API。但是事實上,在編程接口上,它是一個與硬件無關(guān)的規(guī)范。

    OpenGL是用來制圖的,速度非常快。大多數(shù)場合下,它是硬件加速的。看起來好像OpenGL可以實現(xiàn)一切你想要完成的圖形界面。

    不幸的是,OpenGL是為C語言而寫的。不得不承認,C語言不是用來編寫復雜應用程序的流行語言。關(guān)于OpenGL一個最大的缺點就是:如果你不創(chuàng)建一個窗口(用來把你的圖形放入其中),你就什么都做不了。但是OpenGL沒有提供給你創(chuàng)建窗口的方法。這使得OpenGL對于初學者來說顯得比較難。

    幸運地是,出現(xiàn)了GLUT (OpenGL Utility Toolkit)(OpenGL工具包)。它被用來輕松應對窗口、按鈕以及用戶事件。盡管如此,對于想要使用面向?qū)ο蟮木幊痰某绦騿T來說,學習用C或者C++來編寫OpenGL程序仍然是一件痛苦的事。

    然后出現(xiàn)了JOGL

    Java也許是最流行的真正的面向?qū)ο蟮木幊陶Z言。有許多用Java去結(jié)合OpenGL的嘗試,但是第一個被大家認可并注意的是Java對于OpenGl的綁定(Java Bindings for OpenGL), 或者稱為JOGL。理由是它得到Sun(Java的創(chuàng)建者)和SGI(OpenGL的創(chuàng)建者)的支持。

    如今,Sun的游戲開發(fā)小組正在開發(fā)JOGL。它是以肯·拉塞爾和克里斯·克蘭開發(fā)的Jungle開始的。拉塞爾是Sun的員工,研發(fā)“HotSpot虛擬機”,擁有多年的三維經(jīng)驗。克蘭則研發(fā)“荒謬的游戲”,對三維圖形學也相當有經(jīng)驗。

    我個人對他們以及所有其它工作在JOGL上的人表示感謝。曾經(jīng)有許多想通過友好的Java API來使用OpenGL的嘗試——其中包括Java 3D, OpenGL for Java Technology (gl4java)(用于Java技術(shù)的OpenGL),Lightweight Java Game Library (LWJGL)(輕量級的Java游戲庫)。JOGL是第一個使我感到滿意的。

    JOGL是Sun支持的對于OpenGl的Java類綁定。哇!這句話說得太妙了。

    OpenGL被用來展示三維模型。它強大、快速,而且可能是自Swing出現(xiàn)以來最棒的一樣東西。通過JOGL來使用OpenGL,你可以制作出很酷的游戲或是模型位置什么的,而在這之前創(chuàng)建它們需要非常昂貴的成本。有人寫了很厚很厚的書來描述OpenGL,當你熟悉了它們以后這些書會很有用,但現(xiàn)在不行。你必須學習展現(xiàn)在你面前的OpenGL是如何使用Java API的。同樣你還得看一下關(guān)于net.java.games.jogl.*的基礎(chǔ)介紹,可能還得補習一下數(shù)學知識。

    獲取JOGL?

    如果你想使用JOGL,你需要得到jogl.jar以及附帶的本機代碼。我希望有一天它可以成為Java的標準安裝,但現(xiàn)在它只是一個夢想。

    第一步是要找到你的操作系統(tǒng)所對應的包,并進行解壓縮。我是在http://www.javaworld.com/javaworld/jw-02-2005/jw-0221-jogl.html#resources上找到的。不同的操作系統(tǒng)有所區(qū)別,但需要安裝2個部分。系統(tǒng)的classpath里一定要有jogl.jar,而且binary庫必須放在和你操作系統(tǒng)的庫同一個地方。如果比較幸運的話,安裝程序可以為你完成這些。如果你沒有安裝程序而且不知道該上哪里去尋找關(guān)于設置計算機的信息的話,你可以從我提供一個鏈接Resources開始搜索。我們的第一篇代碼是特別用來測試環(huán)境是否安裝正確的,所以對于測試安裝你不必緊張。

    JOGL的Javadocs

    同樣可以在和JOGL 的binary 發(fā)布版一樣的位置獲得Javadocs。Javadocs將會以類似jogl-1.0-usrdoc.tar的名字而命名。

    如果你瀏覽一下net.java.games.jogl包,你很快會注意到有些類非常大。GL便是一個完美的例子。別被這個嚇跑了,你很快能發(fā)現(xiàn)只需一點點JOGL的知識,你就可以完成一些相當復雜的事了。現(xiàn)在你需要掃視一下的類有:
    *GLDrawable
    *GLCanvas
    *GLJPanel
    *GLCapabilities
    *GLDrawableFactory

    這些是連接圖形世界基本的接口。如果你還記得,前面我提到對于初學OpenGL的人來說,有一個很大的缺點,那就是缺乏窗口系統(tǒng)的標準。對應于C語言,GLUT起到了相當大的作用。而我們則有Swing和AWT(抽象窗口工具箱)。很可能你已經(jīng)使用過AWT或者Swing了,所以你不會感到自己在從頭學起。這是件非常好的事情。在通過了非常簡短的關(guān)于把JOGL組件放置到屏幕上的介紹以后,我們不需要多長時間就可以運行出一個相當酷而且流行的程序了。
    GlueGen...幾乎和JOGL一樣酷?
    你應該意識到,OpenGL是為C程序員而寫的。這意味著Java想要利用它,必須要用到本機接口。不那么有趣的JNI(Java本機接口)必須用來進行此連接。OpenGL太大了,手寫所有的連接太費時。想稍微做出一點復雜的程序,有許多特別出售的特性,OpenGL則保持改進,那意味著得有相應的變化來跟上OpenGL的步伐。簡而言之,對于任何試著寫與OpenGL保持同步,包含所有Java到本機的接口的代碼的嘗試,是非常困難的。

    讓我們進入JOGL家族看看。他們打算利用C頭文件寫一些代碼來實現(xiàn)一切JNI做的事。他們管這個叫做GlueGen。GlueGen解析C頭文件然后魔法般地創(chuàng)建出Java和JNI代碼以便連接到本機庫。這意味著OpenGL的升級可以迅速地在JOGL里體現(xiàn)。

    Hello World!

    我是一個很傳統(tǒng)的人,所以當然我們將從“你好世界”程序開始。這個“你好世界”程序?qū)z驗我們的安裝是否全部或者一部分安裝正確。回憶一下安裝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庫是否已經(jīng)安裝正確了。只有當jogl.jar和本機庫(名字諸如libjogl.jnilib或者jogl.dll)兩者都安裝好了的時候,JOGL才算是安裝完全的。如果本機庫不可用,程序會拋java.lang.UnsatisfiedLinkError例外。如果classpath里沒有安裝JAR,程序則根本編譯都通不過。Javac編譯器會報諸如此類的錯“net.java.games.jogl包不存在”。當這個程序編譯通過且運行起來沒有異常的話,你可以繼續(xù)學習JOGL了。

    一個好的模板
    當你對JOGL感到思維混亂的時候,讓我們來繼續(xù)看幾個類,你可以把它們當成有用的模板來使用。我已經(jīng)不止一次把它們當成模板用了。你可以隨心所欲地使用它們。

    這個模板由兩個類組成。第一個是如下所示的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.
       * 這是個基礎(chǔ)的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關(guān)閉的時候,結(jié)束進程
          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相關(guān)的三行代碼上。首先:

    這決定了我們的JOGL庫和JVM可以使用哪些OpenGL/圖形特色。

    接著:

    GLCanvas glcanvas =
       GLDrawableFactory.getFactory().createGLCanvas(glcaps);



    我們不能創(chuàng)建GLCanvas或者GLJPanel。我們得用GLDrawableFactory來創(chuàng)建它們。所以我們用GLDrawableFactory的靜態(tài)方法getFactory()取得了GLDrawableFactory。

    現(xiàn)在我們有GLDrawableFactory了。所以我們用createGLCanvas()方法來創(chuàng)建了可以往上畫畫的GLCanvas。如果我們不需要AWT組件,而是Swing組件,則可以用createGLJPanel()方法。

    注意我們把先前創(chuàng)建的GLCapabilities對象傳了進去。這可以使我們創(chuàng)建的GLDrawable適當?shù)乃鶆?chuàng)建。

    最后,我們準備往GLCanvas上加GLEventListener。

    我們對GLEventListener的實現(xiàn)是SimpleGLEventListener。它負責當接到GLDrawable或我們的或只是GLCanvas的調(diào)用時,所需要完成的所有繪圖工作。你將會看到,我不打算在這個程序里畫任何東西。下面是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)大小改變時被調(diào)用。
        * 我們不需要它,但你可能最后會用到——雖然現(xiàn)在并不需要。
        */
       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.
        * 當程序運行時顯示深度被改變的時候此方法被調(diào)用。
        * 現(xiàn)在這種事發(fā)生得不多,除非程序里面觸發(fā)此事。
        */
       public void displayChanged(
                                   GLDrawable drawable,
                                   boolean modeChanged,
                                   boolean deviceChanged
                                 ) {}
    }



    以上就是我們要完成的JOGL核心工作。注意下面的UML圖。SimpleJoglApp是一個JFrame。它容納了GLDrawable,實際上是一個GLCanvas,但不要那樣稱呼它。我們加入了SimpleGLEventListener。SimpleGLEventListener實現(xiàn)了對于GLCanvas的GLEventListener,這樣當它想執(zhí)行任何的OpenGL 工作的時候,GLCanvas就可以知道。GLDrawables能自動執(zhí)行,所以你確實得使你的GLEventListener最優(yōu)化。



    這個程序運行起來可能會根據(jù)你的操作系統(tǒng)顯得有點亂七八糟。這是預料之中的,因為你在這里只是往屏幕上顯示隨機的內(nèi)存。所以恭喜你具有了圖形創(chuàng)新的才能了。
    了。



    準備實戰(zhàn)

    當你熟悉了前面的例子以后,我們來畫一張漂亮的圖。

    這就是你接下來的程序。請確保你輸入了所有的代碼到你的編輯器中。調(diào)試這些程序可以快速地使你明白它們的工作原理。

    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.
    * 這是個基礎(chǔ)的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關(guān)閉的時候,結(jié)束進程
          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名。希望你能夠閱讀代碼中的注釋,否則你會搞不清它要做什么。

    我們實現(xiàn)的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的實現(xiàn)時,可能會感到不知所措。如果你有用C語言編寫OpenGL程序的經(jīng)驗的話,你也許能猜測出一些東西。如果你覺得比較茫然,不必擔心,也不要擔心我會讓你記住這些東西,至少現(xiàn)在不必。本書接下來的篇幅將會對這個例子中的SecondGLEventListener作出解釋。現(xiàn)在,你只需要試著去猜測。試著去修改代碼,產(chǎn)生兩行,或者一行斜的,而不是一行水平線;或是讓所有的點都變成藍色或紅色。盡情娛樂,這就是你接下來學習JOGL的方式。

    資源
    Matrix JAVA社區(qū):http://www.matrix.org.cn
    這篇文章,摘錄了《學習Java對于OpenGl的綁定》一書的第一章“你好,JOGL”。吉恩·戴維斯(2004):http://www.genedavissoftware.com/books/jogl/
    JOGL項目: https://jogl.dev.java.net/
    JOGL用戶指南: https://jogl.dev.java.net/nonav/source/browse/*checkout*
    /jogl/doc/userguide/index.html?rev=HEAD&content-type=text/html
    預編譯代碼: https://games-binaries.dev.java.net/build/index.html
    JOGL演示: https://jogl-demos.dev.java.net/

    posted on 2006-07-14 08:06 XiaoLi 閱讀(1462) 評論(0)  編輯  收藏 所屬分類: Java

    公告


    文章發(fā)布許可

    本站作品均采用知識共享署名-非
    商業(yè)性使用-禁止演繹 2.5 中國大
    陸許可協(xié)議
    進行許可。

    Books I've Translated

    《精通Nginx(第二版)》

    精通Nginx(第二版)
    《云計算:原理與范式》

     云計算:原理與范式

    《SQL技術(shù)手冊(第三版)》
    SQL技術(shù)手冊(第三版)
    《MySQL核心技術(shù)手冊(第二版)》
    MySQL核心技術(shù)手冊(第2版)
    《RESTful Web Services中文版》
    RESTful Web Services中文版

    導航

    留言簿(2)

    隨筆分類

    搜索

    最新評論

    主站蜘蛛池模板: 久久久久国色AV免费看图片| 国产一区视频在线免费观看| 亚洲日本一线产区和二线| 四虎永久成人免费| 日韩精品无码专区免费播放| 亚洲午夜福利在线视频| 国产亚洲一区二区精品| 香蕉高清免费永久在线视频 | 久久精品国产亚洲AV嫖农村妇女 | 亚洲国产精品xo在线观看| 又爽又高潮的BB视频免费看| 一区二区三区四区免费视频| 精品特级一级毛片免费观看| 久久亚洲熟女cc98cm| 亚洲国产精品无码久久久久久曰| 亚洲一级免费毛片| 黄色视频在线免费观看| 亚洲综合在线一区二区三区 | 国产精品无码亚洲精品2021| 亚洲国语精品自产拍在线观看| 午夜国产羞羞视频免费网站| 可以免费看黄视频的网站| 好湿好大好紧好爽免费视频| 狠狠入ady亚洲精品| 久久久久se色偷偷亚洲精品av| 亚洲国产精品无码av| 免费a级毛片大学生免费观看| 无遮免费网站在线入口| 日韩电影免费在线观看网站| 黄色a级免费网站| 亚洲欧美精品午睡沙发| 亚洲精品一卡2卡3卡三卡四卡| 亚洲综合在线另类色区奇米| 免费一级毛片在级播放| 在线观看免费毛片| 午夜性色一区二区三区免费不卡视频 | 亚洲国产精品免费在线观看| 久久久久久国产a免费观看不卡| 激情小说亚洲图片| 亚洲精品无码一区二区| 亚洲国产夜色在线观看|