jogl基础入门学习

来源:互联网 发布:node 跨域请求 编辑:程序博客网 时间:2024/05/22 14:49

1、jogl是什么?

jogl是Java OpenGL的简称,想真正的了解它,就需要了解OpenGL,OpenGL是Open Graphics Library,它是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,请参考http://baike.baidu.com/view/9222.htm,他其实是一个命令的的集合,300多条,算不上编程语言,他最难的在于计算机图形学的知识,而jogl是用java通过jni调用,对openGL的一个封装,所以速度上并不比c慢多少,并且加上java特有的面向对象的特性,来开发游戏比直接用c有过之而无不及!

2、jogl的安装配置;

下载地址:如果去官方下载,就直接在他的svn中checkout下来,去里面的项目找, http://jogl.dev.java.net,

 为了方便我直接上传了一份;

eclipse下配置:jar包放在build-path下,dll文件,可以在项目下建立个native文件夹,把jogl.jar的NativeLibraryLocation位置选中native就行了。(召唤美女军团)

3、验证配置,可以用下面代码

Java代码  收藏代码
  1. public class Validate {  
  2.   
  3.     public static void main(String[] args) {  
  4.         try {  
  5.             System.loadLibrary("jogl");  
  6.             System.out.println("正确配置");  
  7.         } catch (Exception e) {  
  8.             System.out.println("没有正确配置:" + e.getMessage());  
  9.         }  
  10.   
  11.     }  
  12.   
  13. }  

 没有正确配置的话会有下面异常

Java代码  收藏代码
  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path  
  2.     at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)  
  3.     at java.lang.Runtime.loadLibrary0(Runtime.java:823)  
  4.     at java.lang.System.loadLibrary(System.java:1030)  
  5.     at org.ligson.jogl.test.Validate.main(Validate.java:7)  

 4、OpenGL开发前需要知道的

OpenGL为了兼容各种环境,没有实现窗口,但是他画图又必须在窗口下画,在C库中依赖于glut,在Java中就依赖于swing了,所以第一步应该建立一个窗口extends JFrame,

5、先看一个Hello,World!

Java代码  收藏代码
  1. package org.ligson.jogl.test;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.event.WindowAdapter;  
  5. import java.awt.event.WindowEvent;  
  6.   
  7. import javax.media.opengl.GL;  
  8. import javax.media.opengl.GLAutoDrawable;  
  9. import javax.media.opengl.GLCanvas;  
  10. import javax.media.opengl.GLCapabilities;  
  11. import javax.media.opengl.GLEventListener;  
  12. import javax.swing.JFrame;  
  13.   
  14. public class Pointer extends JFrame implements GLEventListener, Runnable {  
  15.   
  16.     // gl库的handler,相当于画笔  
  17.     GL gl;  
  18.     // 画布,跟html5的Canvas一样,  
  19.     GLCanvas canvas;  
  20.     // 指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。  
  21.     GLCapabilities capabilities;  
  22.   
  23.     Thread thread = new Thread(this);  
  24.   
  25.   
  26.     public Pointer() {  
  27.         super("Demo4");  
  28.         this.setSize(500500);  
  29.         this.setLocationRelativeTo(null);  
  30.   
  31.         capabilities = new GLCapabilities();  
  32.         canvas = new GLCanvas(capabilities);  
  33.   
  34.         canvas.addGLEventListener(this);  
  35.   
  36.         this.addWindowListener(new WindowAdapter() {  
  37.             public void windowClosing(WindowEvent e) {  
  38.                 System.exit(0);  
  39.             }  
  40.         });  
  41.   
  42.         this.add(canvas, BorderLayout.CENTER);  
  43.   
  44.         thread.start();  
  45.     }  
  46.   
  47.     @Override  
  48.     public void run() {  
  49.         while (true) {  
  50.             try {  
  51.                 Thread.sleep(20);  
  52.             } catch (InterruptedException e) {  
  53.                 e.printStackTrace();  
  54.             }  
  55.   
  56.             canvas.display();  
  57.         }  
  58.     }  
  59.   
  60.     @Override  
  61.     public void display(GLAutoDrawable drawable) {  
  62.         gl.glClear(GL.GL_COLOR_BUFFER_BIT);  
  63.         gl.glColor3f(1.0f, 0.0f, 0.0f);  
  64.   
  65.         gl.glPointSize(10.0f);  
  66.         gl.glBegin(GL.GL_POINTS);  
  67.             gl.glVertex3f(50.0f, 50.0f, 50.0f);  
  68.         gl.glEnd();  
  69.         gl.glFlush();  
  70.     }  
  71.   
  72.     @Override  
  73.     public void displayChanged(GLAutoDrawable drawable, boolean arg1,  
  74.             boolean arg2) {  
  75.   
  76.     }  
  77.   
  78.     @Override  
  79.     public void init(GLAutoDrawable drawable) {  
  80.         gl = drawable.getGL();  
  81.         gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);  
  82.     }  
  83.   
  84.     @Override  
  85.     public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {  
  86.         if (h == 0) {  
  87.             h = 1;  
  88.         }  
  89.   
  90.         int windowWidth;  
  91.         int windowHeight;  
  92.   
  93.         gl.glViewport(00, w, h);  
  94.         gl.glMatrixMode(GL.GL_PROJECTION);  
  95.         gl.glLoadIdentity();  
  96.   
  97.         if (w <= h) {  
  98.             windowWidth = 250;  
  99.             windowHeight = 250 * h / w;  
  100.         } else {  
  101.             windowWidth = 250 * w / h;  
  102.             windowHeight = 250;  
  103.         }  
  104.         gl.glOrtho(0 - windowWidth, windowWidth, 0 - windowHeight,  
  105.                 windowHeight, 250.0f, -250.0f);  
  106.         gl.glMatrixMode(GL.GL_MODELVIEW);  
  107.         gl.glLoadIdentity();  
  108.   
  109.     }  
  110.   
  111.     public static void main(String[] args) {  
  112.         Pointer demo5 = new Pointer();  
  113.         demo5.setVisible(true);  
  114.     }  
  115.   
  116. }  

 6、上面的hello,world吓住你了吗?太长了吧,我刚开始跟你一样!先说上面是干嘛的?他其实就是先空间画一个10.0f像素的点(glPonitSize(10.0f));了解几个函数

Java代码  收藏代码
  1. public void init(GLAutoDrawable drawable) {  

初始化时调用,给GL 赋值

Java代码  收藏代码
  1. @Override  
  2.     public void display(GLAutoDrawable drawable) {  

每次显示时都会调用的,他一般在一个线程里,不停的画,因为他只显示一次,当屏幕进行刷新时就没有了,

Java代码  收藏代码
  1. @Override  
  2.     public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {  

当窗口大小进行改变时调用,初次显示也算,

Java代码  收藏代码
  1. @Override  
  2.     public void displayChanged(GLAutoDrawable drawable, boolean arg1,  
  3.             boolean arg2) {  

显示改变时调用,,具体的不知道,我也没有用过

7、后续。。。。。。

原创粉丝点击