JOGL——Java与OpenGL的结合 Java3D

qiangbizhi 2012-02-25

原文链接:

http://www.cnblogs.com/yxnchinahlj/archive/2010/10/29/1864375.html

JOGL——Java与OpenGL的结合Java3D

JOGL

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

JOGL的背景

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

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

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

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

JOGL

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

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

JOGL-获取JOGL

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

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

JOGL-实例

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

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importnet.java.games.jogl.*;

/**

*ThisisabasicJOGLapp.Feelfreeto

*reusethiscodeormodifyit.

*这是个基础的JOGL程序,你可以随意重用该代码或者修改它。

*/

publicclassSecondJoglAppextendsJFrame{

publicstaticvoidmain(String[]args){

finalSecondJoglAppapp=newSecondJoglApp();

//showwhatwe'vedone

//看一下我们做了什么

SwingUtilities.invokeLater(

newRunnable(){

publicvoidrun(){

app.setVisible(true);

}

}

);

}

publicSecondJoglApp(){

//settheJFrametitle

//设置JFrame标题

super("SecondJOGLApplication");

//killtheprocesswhentheJFrameisclosed

//当JFrame关闭的时候,结束进程

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//onlythreeJOGLlinesofcode...andheretheyare

//只有三行JOGL代码...如下

GLCapabilitiesglcaps=newGLCapabilities();

GLCanvasglcanvas=

GLDrawableFactory.getFactory().createGLCanvas(glcaps);

glcanvas.addGLEventListener(newSecondGLEventListener());

//addtheGLCanvasjustlikewewouldanyComponent

//像其它组件一样把GLCanvas加入

getContentPane().add(glcanvas,BorderLayout.CENTER);

setSize(500,300);

//centertheJFrameonthescreen

//使JFrame显示在屏幕中央

centerWindow(this);

}

publicvoidcenterWindow(Componentframe){

DimensionscreenSize=

Toolkit.getDefaultToolkit().getScreenSize();

DimensionframeSize=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确实相对于前面一个例子有了一些改进,它允许我们画出一些漂亮的图来。

importnet.java.games.jogl.*;

/**

*ForourpurposesonlytwooftheGLEventListenersmatter.

*Thosewouldbeinit()anddisplay().

*为了达到我们的目的,GLEventListener中只有两个方法有用。

*它们是init()和display()。

*/

publicclassSecondGLEventListenerimplementsGLEventListener

{

/**

*Takecareofinitializationhere.

*注意这里的初始化。

*/

publicvoidinit(GLDrawablegld){

GLgl=gld.getGL();

GLUglu=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);

}

/**

*Takecareofdrawinghere.

*注意这里的绘图。

*/

publicvoiddisplay(GLDrawabledrawable){

floatred=0.0f;

floatgreen=0.0f;

floatblue=0.0f;

GLgl=drawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glPointSize(5.0f);

for(inti=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();

}

}

publicvoidreshape(

GLDrawabledrawable,

intx,

inty,

intwidth,

intheight

){}

publicvoiddisplayChanged(

GLDrawabledrawable,

booleanmodeChanged,

booleandeviceChanged

){}

}

以上就是我们第一个有趣的JOGL程序。下图是输出,有很多好看的颜色。

image

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

JOGL-实例

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

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importnet.java.games.jogl.*;

/**

*ThisisabasicJOGLapp.Feelfreeto

*reusethiscodeormodifyit.

*这是个基础的JOGL程序,你可以随意重用该代码或者修改它。

*/

publicclassSecondJoglAppextendsJFrame{

publicstaticvoidmain(String[]args){

finalSecondJoglAppapp=newSecondJoglApp();

//showwhatwe'vedone

//看一下我们做了什么

SwingUtilities.invokeLater(

newRunnable(){

publicvoidrun(){

app.setVisible(true);

}

}

);

}

publicSecondJoglApp(){

//settheJFrametitle

//设置JFrame标题

super("SecondJOGLApplication");

//killtheprocesswhentheJFrameisclosed

//当JFrame关闭的时候,结束进程

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//onlythreeJOGLlinesofcode...andheretheyare

//只有三行JOGL代码...如下

GLCapabilitiesglcaps=newGLCapabilities();

GLCanvasglcanvas=

GLDrawableFactory.getFactory().createGLCanvas(glcaps);

glcanvas.addGLEventListener(newSecondGLEventListener());

//addtheGLCanvasjustlikewewouldanyComponent

//像其它组件一样把GLCanvas加入

getContentPane().add(glcanvas,BorderLayout.CENTER);

setSize(500,300);

//centertheJFrameonthescreen

//使JFrame显示在屏幕中央

centerWindow(this);

}

publicvoidcenterWindow(Componentframe){

DimensionscreenSize=

Toolkit.getDefaultToolkit().getScreenSize();

DimensionframeSize=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确实相对于前面一个例子有了一些改进,它允许我们画出一些漂亮的图来。

importnet.java.games.jogl.*;

/**

*ForourpurposesonlytwooftheGLEventListenersmatter.

*Thosewouldbeinit()anddisplay().

*为了达到我们的目的,GLEventListener中只有两个方法有用。

*它们是init()和display()。

*/

publicclassSecondGLEventListenerimplementsGLEventListener

{

/**

*Takecareofinitializationhere.

*注意这里的初始化。

*/

publicvoidinit(GLDrawablegld){

GLgl=gld.getGL();

GLUglu=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);

}

/**

*Takecareofdrawinghere.

*注意这里的绘图。

*/

publicvoiddisplay(GLDrawabledrawable){

floatred=0.0f;

floatgreen=0.0f;

floatblue=0.0f;

GLgl=drawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glPointSize(5.0f);

for(inti=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();

}

}

publicvoidreshape(

GLDrawabledrawable,

intx,

inty,

intwidth,

intheight

){}

publicvoiddisplayChanged(

GLDrawabledrawable,

booleanmodeChanged,

booleandeviceChanged

){}

}

以上就是我们第一个有趣的JOGL程序。下图是输出,有很多好看的颜色。

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

分类:Java3D

相关推荐

Tokyo0 / 0评论 2014-12-15

bingxuelengmei / 0评论 2014-12-04