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