科技: 人物 企业 技术 IT业 TMT
科普: 自然 科学 科幻 宇宙 科学家
通信: 历史 技术 手机 词典 3G馆
索引: 分类 推荐 专题 热点 排行榜
互联网: 广告 营销 政务 游戏 google
新媒体: 社交 博客 学者 人物 传播学
新思想: 网站 新书 新知 新词 思想家
图书馆: 文化 商业 管理 经济 期刊
网络文化: 社会 红人 黑客 治理 亚文化
创业百科: VC 词典 指南 案例 创业史
前沿科技: 清洁 绿色 纳米 生物 环保
知识产权: 盗版 共享 学人 法规 著作
用户名: 密码: 注册 忘记密码?
    创建新词条
科技百科
  • 人气指数: 5714 次
  • 编辑次数: 1 次 历史版本
  • 更新时间: 2009-03-31
admin
admin
发短消息
相关词条
世界品牌实验室
世界品牌实验室
泛在信息社会
泛在信息社会
计算机存储单位
计算机存储单位
TeraGrid
TeraGrid
CMMI
CMMI
世界品牌实验室
世界品牌实验室
并行总线
并行总线
IT失业指南
IT失业指南
GoblinX
GoblinX
GNOME Do
GNOME Do
推荐词条
希拉里二度竞选
希拉里二度竞选
《互联网百科系列》
《互联网百科系列》
《黑客百科》
《黑客百科》
《网络舆情百科》
《网络舆情百科》
《网络治理百科》
《网络治理百科》
《硅谷百科》
《硅谷百科》
2017年特斯拉
2017年特斯拉
MIT黑客全纪录
MIT黑客全纪录
桑达尔·皮查伊
桑达尔·皮查伊
阿里双十一成交额
阿里双十一成交额
最新词条

热门标签

微博侠 数字营销2011年度总结 政务微博元年 2011微博十大事件 美国十大创业孵化器 盘点美国导师型创业孵化器 盘点导师型创业孵化器 TechStars 智能电视大战前夜 竞争型国企 公益型国企 2011央视经济年度人物 Rhianna Pratchett 莱恩娜·普莱契 Zynga与Facebook关系 Zynga盈利危机 2010年手机社交游戏行业分析报告 游戏奖励 主流手机游戏公司运营表现 主流手机游戏公司运营对比数据 创建游戏原型 正反馈现象 易用性设计增强游戏体验 易用性设计 《The Sims Social》社交亮 心理生理学与游戏 Kixeye Storm8 Storm8公司 女性玩家营销策略 休闲游戏的创新性 游戏运营的数据分析 社交游戏分析学常见术语 游戏运营数据解析 iPad风行美国校园 iPad终结传统教科书 游戏平衡性 成长类型及情感元素 鸿蒙国际 云骗钱 2011年政务微博报告 《2011年政务微博报告》 方正产业图谱 方正改制考 通信企业属公益型国企 善用玩家作弊行为 手机游戏传播 每用户平均收入 ARPU值 ARPU 游戏授权三面观 游戏设计所运用的化学原理 iOS应用人性化界面设计原则 硬核游戏 硬核社交游戏 生物测量法研究玩家 全球移动用户 用户研究三部曲 Tagged转型故事 Tagged Instagram火爆的3大原因 全球第四大社交网络Badoo Badoo 2011年最迅猛的20大创业公司 病毒式传播功能支持的游戏设计 病毒式传播功能 美国社交游戏虚拟商品收益 Flipboard改变阅读 盘点10大最难iPhone游戏 移动应用设计7大主流趋势 成功的设计文件十个要点 游戏设计文件 应用内置付费功能 内置付费功能 IAP功能 IAP IAP模式 游戏易用性测试 生理心理游戏评估 游戏化游戏 全美社交游戏规模 美国社交游戏市场 全球平板电脑出货量 Facebook虚拟商品收益 Facebook全球广告营收 Facebook广告营收 失败游戏设计的数宗罪名 休闲游戏设计要点 玩游戏可提高认知能力 玩游戏与认知能力 全球游戏广告 独立开发者提高工作效率的100个要点 Facebook亚洲用户 免费游戏的10种创收模式 人类大脑可下载 2012年最值得期待的20位硅谷企业家 做空中概股的幕后黑手 做空中概股幕后黑手 苹果2013营收 Playfish社交游戏架构

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

[显示全部]

背景编辑本段回目录

为了创建一个图形增强的程序,从而出售给使用各种不同操作系统的用户,程序员有一个选择——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程序仍然是一件痛苦的事。

JOGL编辑本段回目录

Java 也许是最流行的真正的面向对象的编程语言。有许多用Java去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGl的绑定(Java Bindings for OpenGL), 或者称为JOGL。理由是它得到Sun(Java的创建者)和SGI(OpenGL的创建者)的支持。
如今,Sun的游戏开发小组正在开发JOGL。它是以肯·拉塞尔和克里斯·克兰开发的Jungle开始的。拉塞尔是Sun的员工,研发“HotSpot虚拟机”,拥有多年的三维经验。克兰则研发“荒谬的游戏”,对三维图形学也相当有经验。
OpenGL 被用来展示三维模型。它强大、快速,而且可能是自Swing出现以来最棒的一样东西。通过JOGL来使用OpenGL,你可以制作出很酷的游戏或是模型位置什么的,而在这之前创建它们需要非常昂贵的成本。有人写了很厚很厚的书来描述OpenGL,当你熟悉了它们以后这些书会很有用,但现在不行。你必须学习展现在你面前的OpenGL是如何使用Java API的。同样你还得看一下关于net.java.games.jogl.*的基础介绍,可能还得补习一下数学知识。

获取JOGL编辑本段回目录

就是要找到你的操作系统所对应的包,并进行解压缩。
这个是可以从https://jogl.dev.java.net/找到的,进入网站后点左侧的文档和文件,我下载了Release Builds 2008JSR-231 1.1.1 - May 22 (15)里面的jogl-1.1.1-windows-i586.zip,解压就得到要的jogl.jar和其他文件了。

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编辑本段回目录

应该意识到,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最优化。

image

这个程序运行起来可能会根据你的操作系统显得有点乱七八糟。这是预料之中的,因为你在这里只是往屏幕上显示随机的内存。所以恭喜你具有了图形创新的才能了。

image

实例编辑本段回目录

这就是你接下来的程序。请确保你输入了所有的代码到你的编辑器中。调试这些程序可以快速地使你明白它们的工作原理。
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程序。下图是输出,有很多好看的颜色。
image
当 你看到GLEventListener的实现时,可能会感到不知所措。如果你有用C语言编写OpenGL程序的经验的话,你也许能猜测出一些东西。如果你 觉得比较茫然,不必担心,也不要担心我会让你记住这些东西,至少现在不必。本书接下来的篇幅将会对这个例子中的 SecondGLEventListener作出解释。现在,你只需要试着去猜测。试着去修改代码,产生两行,或者一行斜的,而不是一行水平线;或是让所 有的点都变成蓝色或红色。尽情娱乐,这就是你接下来学习JOGL的方式。




→如果您认为本词条还有待完善,请 编辑词条

词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
1

标签: JOGL

收藏到: Favorites  

同义词: 暂无同义词

关于本词条的评论 (共0条)发表评论>>

对词条发表评论

评论长度最大为200个字符。