JOGL2.3在Eclipse裏面的配置

使用OpenGL時,大多都是使用C/C++來編程。我之前一直是使用Visual Studio 2013寫OpenGL程序,OpenGL配置很方便,使用CMAKE生成相關庫的解決方案,再VS編譯之,.dll動態庫就自己生成了,而且完美適配你自己的電腦硬件,一般不會出錯。最後,把.h和.dll文件拷到相應的文件夾下面即可。當然,這不是本篇文章的重點,本文主要是介紹OpenGL使用Java平臺來編程時的配置問題。

JOGL就是綁定到Java的OpenGL API。既然要用到JOGL,當然就涉及到一個配置問題。和大家一樣,我在國內網站百度,發現相關的配置教程寫得模模糊糊的,而且大多內容上一致,根本沒一點幫助。我乾脆就自己去谷歌了下,最後配置好了,下面把方法分享給大家。

JOGL有 兩種配置形式:一種使用JAR包(jar文件夾下),另外一種使用.dll動態庫(lib文件夾下),國內很多配置教程把這兩個方法混在了一起。我感覺jar包的方式更方便,所以本文直接使用JAR包來配置。貼出谷歌的原文截圖:

這裏寫圖片描述

這裏寫圖片描述


user library的方法:

第一步:前往http://jogamp.org下載JOGL。
這裏寫圖片描述

如上圖,點擊上面的zip,進入到下載頁面http://jogamp.org/deployment/jogamp-current/archive,然後下載jogamp-all-platforms.7z這個文件就可以了:
這裏寫圖片描述

第二步:解壓文件jogamp-all-platforms.7z,再將解壓好的文件夾拷貝到你的Eclipse的工作區間文件夾(WorkPlace)下面,此時打開Eclipse,直接點Windows → preferences → Java → Build Path → User Libraries:

這裏寫圖片描述

點擊New…按鈕,輸入JOGL(庫名稱,方便以後辨識我用了JOGL):

這裏寫圖片描述

這裏寫圖片描述

點擊Add External JARs…按鈕,進到剛纔放到工作區間(WorkPlace)下面的jogamp-all-platforms文件夾下面的jar文件夾下面,點選”gluegen-rt.jar” “jogl-all.jar”兩個文件即可:

這裏寫圖片描述

這裏寫圖片描述

然後展開JOGL,分別點擊Edit…按鈕編輯Javadoc location項,輸入http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/,然後保存。

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

同樣還是展開JOGL,分別點擊Edit…按鈕編輯Source attachment項,點選Extenal location項,文件還是在工作區間的jogamp-all-platforms文件夾下面,分別是gluegen-java-src.zip、jogl-java-src.zip:

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

上面步驟全部完成之後要記得點擊OK保存。
第三步:新建一個Java項目來驗證JOGL是否配置好,引入剛纔的那個用戶庫的方法,右擊項目名 → Build Path → Add Library… → User Library → Next > → 勾選剛纔創建的那個JOGL用戶庫,點擊OK:
這裏寫圖片描述

這裏寫圖片描述


直接爲單個工程導入jar包的方法:

第一步:項目文件上右鍵New → Folder → 輸入文件夾的名稱(一般命名爲lib,用來存放第三方jar包):

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

第二步:解壓文件jogamp-all-platforms.7,將其中的四個jar包拷貝至剛纔的lib文件夾下面,拷貝好之後選中這四個jar包,直接點右鍵 → Build Path → Add to Build Path:

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

第三步:確認下此時項目文件夾下面是否有如下圖的Reference Libraries,如果有,說明配置成功:

這裏寫圖片描述


上面配置好了,就可以開始測試了。附上測試代碼OpenGL.java:

package lighting;

import javax.swing.JFrame;

import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;

public class LightingPolygon implements GLEventListener {
    private float angle = 0.0f;

    @Override
    public void display(GLAutoDrawable drawable) {
        // 繪製代碼
        final GL2 gl = drawable.getGL().getGL2();


        gl.glColor3f(0.2f, 0.9f, 0.1f);

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glRotated(angle, 0.0f, 1.0f, 0.0f);

        // 光照
        gl.glEnable(GL2.GL_LIGHTING);
        gl.glEnable(GL2.GL_LIGHT0);
        gl.glEnable(GL2.GL_NORMALIZE);//爲了在使用縮放的情況下仍然保證法向量爲單位長度

        // 設置光源
        float[] ambientLight = { 1.0f, 1.0f, 1.0f, 0.0f };//環境光一般這麼設置
        float[] diffuseLight = { 1.0f, 1.0f, 1.0f, 0.0f};//漫反射光一般設置成和環境光一致
        float[] specularLight={0.1f, 0.2f, 0.6f, 0.0f};
        float[] positionLight = { -0.9f, 0.9f, 0.9f, 1.0f };
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
        gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_SPECULAR, specularLight,0);
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, positionLight, 0);

        // 設置光照模型
        float[] ambientModel = { 0.4f, 0.4f, 0.4f, 1.0f };
        float[] viewLmodel = { 0.0f, 0.0f, 0.0f, 1.0f };
        gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, ambientModel, 0);
        gl.glLightModelfv(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, viewLmodel, 0);

        //設置物體材質
//      float[] ambientMat={1.0f,1.0f,1.0f,0.0f};
//      float[] diffuseMat={1.0f,1.0f,1.0f,0.0f};
//      float[] specularMat={1.0f,1.0f,1.0f,1.0f};
//      float[] emissionMat={0.3f,0.2f,0.2f,0.0f};
//      float shininess=100.0f;//鏡面反射係數
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_AMBIENT,ambientMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_DIFFUSE,diffuseMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_SPECULAR,specularMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_EMISSION,emissionMat,0);
//        gl.glMaterialf(GL2.GL_FRONT,GL2.GL_SHININESS,shininess);

        gl.glBegin(GL2.GL_POLYGON);
        gl.glNormal3f(0.0f,0.0f, 1.0f);//指定法向量
        gl.glVertex3f(0f, 0.5f, 0f);
        gl.glVertex3f(-0.5f, 0.2f, 0f);
        gl.glVertex3f(-0.5f, -0.2f, 0f);
        gl.glVertex3f(0f, -0.5f, 0f);
        gl.glVertex3f(0f, 0.5f, 0f);
        gl.glVertex3f(0.5f, 0.2f, 0f);
        gl.glVertex3f(0.5f, -0.2f, 0f);
        gl.glVertex3f(0f, -0.5f, 0f);
        gl.glEnd();
        gl.glFlush();
        angle += 3.0f;

    }

    @Override
    public void dispose(GLAutoDrawable arg0) {
        //
    }

    @Override
    public void init(GLAutoDrawable drawable) {
        // 設置背景顏色
        GL2 gl = drawable.getGL().getGL2();
        gl.glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
    }

    @Override
    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 獲取GL2的所有特性
        final GLProfile proifile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(proifile);

        // 畫布
        final GLCanvas glCanvas = new GLCanvas(capabilities);
        LightingPolygon lightingPolygon = new LightingPolygon();
        glCanvas.addGLEventListener(lightingPolygon);
        glCanvas.setSize(600, 600);

        // 創建JFrame
        final JFrame frame = new JFrame("帶光照效果的旋轉多邊形");

        frame.getContentPane().add(glCanvas);
        frame.setSize(frame.getContentPane().getPreferredSize());
        frame.setVisible(true);

        // 設置動畫
        final FPSAnimator animator = new FPSAnimator(glCanvas, 300, true);
        animator.start();
    }

}

運行出來的效果圖:

這裏寫圖片描述

驗證通過時,窗口爲淡藍色背景,中間有一個旋轉的六邊形。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章