摘要
在这篇文章里,摘录了《学习java对于opengl的绑定》。作者吉恩戴维斯解释了如何开始用java对于opengl的绑定开发图形增强的程序
这些年来,为了创建一个图形增强的程序,从而出售给使用各种不同操作系统的用户,程序员有一个选择——opengl。gl代表图形库(graphics library)。opengl是sgi(美国图形工作站生产厂商)的注册商标。opengl显示了它是一个跨平台的c语言编程api。但是事实上,在编程接口上,它是一个与硬件无关的规范。
opengl是用来制图的,速度非常快。大多数场合下,它是硬件加速的。看起来好像opengl可以实现一切你想要完成的图形界面。
不幸的是,opengl是为c语言而写的。不得不承认,c语言不是用来编写复杂应用程序的流行语言。关于opengl一个最大的缺点就是:如果你不创建一个窗口(用来把你的图形放入其中),你就什么都做不了。但是opengl没有提供给你创建窗口的方法。这使得opengl对于初学者来说显得比较难。
幸运地是,出现了glut (opengl utility toolkit)(opengl工具包)。它被用来轻松应对窗口、按钮以及用户事件。尽管如此,对于想要使用面向对象的编程的程序员来说,学习用c或者c++来编写opengl程序仍然是一件痛苦的事。
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:gene davis;chenroc(作者的blog:http://blog.matrix.org.cn/page/chenroc)
原文:http://www.javaworld.com/javaworld/jw-02-2005/jw-0221-jogl.html
译文:http://www.matrix.org.cn/resource/article/44/44274_jogl+opengl+java.html
关键字:jogl;opengl
然后出现了jogl
java也许是最流行的真正的面向对象的编程语言。有许多用java去结合opengl的尝试,但是第一个被大家认可并注意的是java对于opengl的绑定(java bindings for opengl), 或者称为jogl。理由是它得到sun(java的创建者)和sgi(opengl的创建者)的支持。
如今,sun的游戏开发小组正在开发jogl。它是以肯·拉塞尔和克里斯·克兰开发的jungle开始的。拉塞尔是sun的员工,研发“hotspot虚拟机”,拥有多年的三维经验。克兰则研发“荒谬的游戏”,对三维图形学也相当有经验。
我个人对他们以及所有其它工作在jogl上的人表示感谢。曾经有许多想通过友好的java api来使用opengl的尝试——其中包括java 3d, opengl for java technology (gl4java)(用于java技术的opengl),lightweight java game library (lwjgl)(轻量级的java游戏库)。jogl是第一个使我感到满意的。
jogl是sun支持的对于opengl的java类绑定。哇!这句话说得太妙了。
opengl被用来展示三维模型。它强大、快速,而且可能是自swing出现以来最棒的一样东西。通过jogl来使用opengl,你可以制作出很酷的游戏或是模型位置什么的,而在这之前创建它们需要非常昂贵的成本。有人写了很厚很厚的书来描述opengl,当你熟悉了它们以后这些书会很有用,但现在不行。你必须学习展现在你面前的opengl是如何使用java api的。同样你还得看一下关.net.java.games.jogl.*的基础介绍,可能还得补习一下数学知识。
获取jogl?
如果你想使用jogl,你需要得到jogl.jar以及附带的本机代码。我希望有一天它可以成为java的标准安装,但现在它只是一个梦想。
第一步是要找到你的操作系统所对应的包,并进行解压缩。我是在http://www.javaworld.com/javaworld/jw-02-2005/jw-0221-jogl.html#resources上找到的。不同的操作系统有所区别,但需要安装2个部分。系统的classpath里一定要有jogl.jar,而且binary库必须放在和你操作系统的库同一个地方。如果比较幸运的话,安装程序可以为你完成这些。如果你没有安装程序而且不知道该上哪里去寻找关于设置计算机的信息的话,你可以从我提供一个链接resources开始搜索。我们的第一篇代码是特别用来测试环境是否安装正确的,所以对于测试安装你不必紧张。
jogl的javadocs
同样可以在和jogl 的binary 发布版一样的位置获得javadocs。javadocs将会以类似jogl-1.0-usrdoc.tar的名字而命名。
如果你浏览一.net.java.games.jogl包,你很快会注意到有些类非常大。gl便是一个完美的例子。别被这个吓跑了,你很快能发现只需一点点jogl的知识,你就可以完成一些相当复杂的事了。现在你需要扫视一下的类有:
*gldrawable
*glcanvas
*gljpanel
*glcapabilities
*gldrawablefactory
这些是连接图形世界基本的接口。如果你还记得,前面我提到对于初学opengl的人来说,有一个很大的缺点,那就是缺乏窗口系统的标准。对应于c语言,glut起到了相当大的作用。而我们则有swing和awt(抽象窗口工具箱)。很可能你已经使用过awt或者swing了,所以你不会感到自己在从头学起。这是件非常好的事情。在通过了非常简短的关于把jogl组件放置到屏幕上的介绍以后,我们不需要多长时间就可以运行出一个相当酷而且流行的程序了。
gluegen...几乎和jogl一样酷?
你应该意识到,opengl是为c程序员而写的。这意味着java想要利用它,必须要用到本机接口。不那么有趣的jni(java本机接口)必须用来进行此连接。opengl太大了,手写所有的连接太费时。想稍微做出一点复杂的程序,有许多特别出售的特性,opengl则保持改进,那意味着得有相应的变化来跟上opengl的步伐。简而言之,对于任何试着写与opengl保持同步,包含所有java到本机的接口的代码的尝试,是非常困难的。
让我们进入jogl家族看看。他们打算利用c头文件写一些代码来实现一切jni做的事。他们管这个叫做gluegen。gluegen解析c头文件然后魔法般地创建出java和jni代码以便连接到本机库。这意味着opengl的升级可以迅速地在jogl里体现。
hello world!
我是一个很传统的人,所以当然我们将从“你好世界”程序开始。这个“你好世界”程序将检验我们的安装是否全部或者一部分安装正确。回忆一下安装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);
}
}
}
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.
* 这是个基础的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关闭的时候,结束进程
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
);
}
}
glcanvas glcanvas =
gldrawablefactory.getfactory().createglcanvas(glcaps);
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)大小改变时被调用。
* 我们不需要它,但你可能最后会用到——虽然现在并不需要。
*/
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.
* 当程序运行时显示深度被改变的时候此方法被调用。
* 现在这种事发生得不多,除非程序里面触发此事。
*/
public void displaychanged(
gldrawable drawable,
boolean modechanged,
boolean devicechanged
) {}
}
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.
* 这是个基础的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关闭的时候,结束进程
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
);
}
}
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
) {}
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器