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);
}
}
}
首先,这个程序测试了本机库和Java库是否已经安装正确了。只有当jogl.jar和本机库(名字诸如libjogl.jnilib或者jogl.dll)两者都安装好了的时候,JOGL才算是安装完全的。如果本机库不可用,程序会抛java.lang.UnsatisfiedLinkError例外。如果classpath里没有安装JAR,程序则根本编译都通不过。Javac编译器会报诸如此类的错“net.java.games.jogl包不存在”。当这个程序编译通过且运行起来没有异常的话,你可以继续学习JOGL了。
一个好的模板 当你对JOGL感到思维混乱的时候,让我们来继续看几个类,你可以把它们当成有用的模板来使用。我已经不止一次把它们当成模板用了。你可以随心所欲地使用它们。
这个模板由两个类组成。第一个是如下所示的SimpleJoglApp,第二个是在简短说明之后的SimpleGLEventListener。你必须输入两个类来编译模板。主程序如下:
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
);
}
}
代码就是这些。让我们把注意力集中在第一个类中与JOGL相关的三行代码上。首先:
这决定了我们的JOGL库和JVM可以使用哪些OpenGL/图形特色。
接着:
GLCanvas glcanvas =
GLDrawableFactory.getFactory().createGLCanvas(glcaps);
我们不能创建GLCanvas或者GLJPanel。我们得用GLDrawableFactory来创建它们。所以我们用GLDrawableFactory的静态方法getFactory()取得了GLDrawableFactory。
现在我们有GLDrawableFactory了。所以我们用createGLCanvas()方法来创建了可以往上画画的GLCanvas。如果我们不需要AWT组件,而是Swing组件,则可以用createGLJPanel()方法。
注意我们把先前创建的GLCapabilities对象传了进去。这可以使我们创建的GLDrawable适当的所创建。
最后,我们准备往GLCanvas上加GLEventListener。
我们对GLEventListener的实现是SimpleGLEventListener。它负责当接到GLDrawable或我们的或只是GLCanvas的调用时,所需要完成的所有绘图工作。你将会看到,我不打算在这个程序里画任何东西。下面是GLEventListener的代码:
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
) {}
}
以上就是我们要完成的JOGL核心工作。注意下面的UML图。SimpleJoglApp是一个JFrame。它容纳了GLDrawable,实际上是一个GLCanvas,但不要那样称呼它。我们加入了SimpleGLEventListener。SimpleGLEventListener实现了对于GLCanvas的GLEventListener,这样当它想执行任何的OpenGL 工作的时候,GLCanvas就可以知道。GLDrawables能自动执行,所以你确实得使你的GLEventListener最优化。
这个程序运行起来可能会根据你的操作系统显得有点乱七八糟。这是预料之中的,因为你在这里只是往屏幕上显示随机的内存。所以恭喜你具有了图形创新的才能了。
准备实战
当你熟悉了前面的例子以后,我们来画一张漂亮的图。
这就是你接下来的程序。请确保你输入了所有的代码到你的编辑器中。调试这些程序可以快速地使你明白它们的工作原理。
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
);
}
}
请注意这个类对于第一个类所作的改动。改动只有类名、frame名、以及GLEventListener名。希望你能够阅读代码中的注释,否则你会搞不清它要做什么。
我们实现的GLEventListener确实相对于前面一个例子有了一些改进,它允许我们画出一些漂亮的图来。
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
) {}
}
|
相关推荐
JOGL 实现了 Java 和 OpenGL 的绑定,它给 Java 的 3D 绘图提供了硬件支持。 绘图模型和图形库 ----------------- 图形显示器就是一块由许多像素点组成的绘图区域,图形系统的核心就是一支魔法画笔,这支画笔能以...
《Java OpenGL绑定库JOGL详解及其在3D图形编程中的应用》 JOGL,全称为Java Bindings for OpenGL,是Java平台上的一个开源项目,它为Java开发者提供了一个与OpenGL标准交互的接口。OpenGL是一种广泛应用于图形处理...
而`jogl-demos 1.1.0`是针对Java平台的OpenGL API绑定,它为Java开发者提供了一个桥梁,使得他们能够利用OpenGL的强大功能来创建复杂的图形应用程序。 `jogl-demos`是`jogl`库的扩展部分,主要包含了各种示例代码和...
JOGL提供了与原生OpenGL API的直接绑定,让开发者可以直接控制图形硬件,实现高性能的图形渲染。JOGL的API设计与Java语言风格相一致,降低了学习和使用的门槛。 总之,"jogl-2.0-b23-20110303-windows-i586"是一个...
Java OpenGL(JOGL)是OpenGL在Java平台上的一个绑定,它为Java开发者提供了访问OpenGL功能的桥梁,使他们能够在Java应用程序中创建高性能的图形。 标题中的"jogl-1.1.2-pre-20080523-windows-i586.zip"是指JOGL的...
1.下载解压后,先从Eclipse中打开想要绑定OpenGL的Project; 2.选择 Project -> Property -> Java Build Path -> Library -> add External JARs,将解压后文件夹lib下的gluegen-rt和jogl导入; 3.在加入的两个文件下...
在JOGL的场景中,GlueGen用于生成Java对OpenGL原生库的绑定,确保Java代码能够有效地调用底层的OpenGL实现。GlueGen的工作原理是解析OpenGL的头文件,然后生成相应的Java接口,使得Java开发者可以像使用普通Java类...
- **OpenGL绑定**:提供了一个完整的Java API,与OpenGL标准保持同步,让开发者可以直接调用所有OpenGL函数。 - **跨平台**:尽管这里的版本是针对Windows 32位的,但JOGL设计为在多种操作系统上运行,包括Linux、...
JOGL是Java绑定到OpenGL的库,允许开发者在Java平台上使用OpenGL进行图形渲染和3D图形处理。 【OpenGL】: OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。它是图形硬件的标准接口,可以高效地...
而Jogl(Java OpenGL)是Java平台上的一个OpenGL绑定库,它允许Java开发者直接使用OpenGL的功能进行高性能的图形编程。本文将深入探讨"jogl-2.1开发相关文件",帮助开发者了解如何搭建并使用Jogl进行开发。 首先,...
标题中的"jogl.rar_JOGL texture_jogl_opengl_opengl java_opengl texture Java"表明这是一个与JOGL(Java OpenGL)库相关的压缩包,主要涉及纹理处理。JOGL是Java平台上用于OpenGL编程的一个绑定库,它使得Java...
2. **dll文件**:这是Windows下的动态链接库文件,提供了JOGL与本地系统交互所需的函数实现,特别是与OpenGL接口的绑定。 3. **头文件**(可能为Java源代码或文档形式):包含了JOGL的API定义,帮助开发者了解如何在...
JOGL,全称为Java OpenGL,是一个Java绑定库,允许Java开发者直接使用OpenGL(一个广泛用于图形处理的低级编程接口)的功能。OpenGL是跨语言、跨平台的编程接口,主要用于渲染2D、3D图像,常应用于游戏开发、科学...
Java OpenGL绑定(JOGL,Java Bindings for OpenGL)则允许Java开发者利用OpenGL的功能,为Java应用程序提供高性能的图形渲染能力。这篇教程"Using OpenGL in Java with JOGL"将深入探讨如何在Java环境中有效地使用...
标题 "jogl-all-mobile-main-2.1.5.zip" 提供的信息暗示这是一个与JOGL(Java OpenGL绑定)相关的软件包,版本号为2.1.5,而且可能是针对移动平台优化的。JOGL允许Java开发者使用OpenGL标准来创建高性能的图形应用...
JOGL是一个Java绑定库,它允许Java程序员直接使用OpenGL图形库进行高性能的3D图形编程。OpenGL是一种跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。版本号2.3.2意味着这是JOGL的稳定更新版,包含了对最新...
JOGL(Java OpenGL)是Java平台上用于访问OpenGL图形库的官方绑定,允许Java开发者利用OpenGL的强大功能进行3D图形编程。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D图像,广泛应用于游戏开发、科学可视...
JOGL是OpenGL在Java平台上的官方绑定,它允许开发者在不依赖于本地库的情况下直接使用OpenGL API。通过JOGL,开发者可以轻松地在跨平台上进行高性能的图形渲染,同时利用Java语言的强大特性和广泛的应用支持。JOGL的...
JOGL使Java开发者能够访问与原生OpenGL库相同的底层功能,从而在Java环境中实现高性能的图形处理。 标题提到的"opengl基于java语言的jar包(jogl)",就是这样一个工具,它将OpenGL的接口转换为Java语言,让开发者...
标题中的“jogl-line-and-bar-graph”提示我们这是一个关于使用JOGL(Java OpenGL绑定)库创建线图和柱状图的项目。JOGL是Java语言与OpenGL交互的库,允许开发者利用OpenGL的强大功能来实现2D和3D图形渲染。 描述中...