JOGL 悠悠 2022-01-10 23:11 55阅读 0赞 有许多用Java去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGL的绑定(Java Bindings for OpenGL),或者称为JOGL。 =================================================================================================================================== JOGL的背景 =================================================================================================================================== 为了创建一个图形增强的程序,从而出售给使用各种不同操作系统的用户,程序员有一个选择——OpenGL。GL代表图形库(graphics library)。OpenGL是SGI的注册商标。OpenGL显示它是一个跨平台的C语言编程API。但是事实上,在编程接口上,它是一个与硬件无关的规范。 OpenGL用来制图,速度非常快。大多数情况下,它是硬件加速的。看起来好像OpenGL可以实现一切你想要完成的图形界面。 然而,OpenGL是为C语言而写的。而C语言不是用来编写复杂应用程序的流行语言。而OpenGL一个最大的缺点是:如果不创建一个窗口(用来把图形放在里面),就什么都做不了(当然,这也是OpenGL的最大优点,它独立于具体的操作系统,语言,甚至是硬件)。而OpenGL没有提供创建窗口的方法。如此使得OpenGL对于初学者来说显得比较困难。 因此,有了GLUT(OpenGL Utility ToolKit)。它被用来轻松应对窗口、按钮以及用户事件。但是,对于想要使用面向对象方法编程的程序员来说,学习用C或者C++来编写OpenGL程序仍然不是一件简单的事情。 ================================================================================================================================== JOGL ================================================================================================================================== Java也许是最流行的真正的面向对象的编程语言。有许多用Java去尝试结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGL的绑定——JOGL。因为它得到Sun和SGI的支持。 OpenGL被用来展示三维模型。它强大、快速,而且可能是自Swing出现以来最棒的一样东西。通过JOGL来使用OpenGL,可以制作出很酷的游戏或者是模型位置等,而在这之前创建它们需要非常昂贵的成本。 JOGL-获取JOGL 就是要找到你操作系统所对应的包,并进行解压。 这个是可以从https://jogl.dev.java.net/找到的,进入网站后点左侧的文档和文件,我下载了Release Builds 2008\\JSR-231 1.1.1 - May 22 (15)里面的jogl-1.1.1-windows-i586.zip,解压就得到要的jogl.jar和其他文件了。 ![Center][] ## JOGL-实例 ## 这就是你接下来的程序。请确保你输入了所有的代码到你的编辑器中。调试这些程序可以快速地使你明白它们的工作原理。 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 ) {} } 当你看到GLEventListener的实现时,可能会感到不知所措。如果你有用C语言编写OpenGL程序的经验的话,你也许能猜测出一些东西。如果你 觉得比较茫然,不必担心,也不要担心我会让你记住这些东西,至少现在不必。本书接下来的篇幅将会对这个例子中的 SecondGLEventListener作出解释。现在,你只需要试着去猜测。试着去修改代码,产生两行,或者一行斜的,而不是一行水平线;或是让所 有的点都变成蓝色或红色。尽情娱乐,这就是你接下来学习JOGL的方式。 ## JOGL-实例 ## 这就是你接下来的程序。请确保你输入了所有的代码到你的编辑器中。调试这些程序可以快速地使你明白它们的工作原理。 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程序。下图是输出,有很多好看的颜色。 当 你看到GLEventListener的实现时,可能会感到不知所措。如果你有用C语言编写OpenGL程序的经验的话,你也许能猜测出一些东西。如果你 觉得比较茫然,不必担心,也不要担心我会让你记住这些东西,至少现在不必。本书接下来的篇幅将会对这个例子中的 SecondGLEventListener作出解释。现在,你只需要试着去猜测。试着去修改代码,产生两行,或者一行斜的,而不是一行水平线;或是让所 有的点都变成蓝色或红色。尽情娱乐,这就是你接下来学习JOGL的方式。 [Center]: /images/20220110/cf7f3c66687b44d4abd1520207f3eec0.png
相关 JOGL学习(3)—— 旋转彩色立方体 参考链接:[https://iowiki.com/jogl/jogl\_3d\_cube.html][https_iowiki.com_jogl_jogl_3d_cube 刺骨的言语ヽ痛彻心扉/ 2023年07月13日 03:39/ 0 赞/ 29 阅读
相关 JOGL学习(2)—— 地球月球太阳_相机+动画 第一个,相机设置,如下代码,重要函数参数已在代码中注释 package t1; //地球、太阳、月亮 动画 import j 古城微笑少年丶/ 2023年07月13日 03:28/ 0 赞/ 9 阅读
相关 JOGL学习(1)—— 第一个JOGL程序 这里写一个最简单的JOGL程序,证明配置成功,并且做一点简单的说明: JOGL就是重写GLEventListener里面的一些方法,用过swing画图的应该知道,通过r 爱被打了一巴掌/ 2023年07月12日 09:13/ 0 赞/ 18 阅读
相关 JOGL库javax.media与com.jogamp -------------------- javax.media.opengl.awt.GLCanvas; com.jogamp.opengl.a 一时失言乱红尘/ 2023年07月12日 08:45/ 0 赞/ 43 阅读
相关 JOGL2.3.2全平台文件 由于官网下载速度太慢!我百兆光纤下了半个小时 (눈‸눈) 特此分享下载好的文件:jogamp-all-platforms,此文件包含全平台,下载时间2020.3.1,版本号2 曾经终败给现在/ 2023年07月10日 11:13/ 0 赞/ 11 阅读
相关 JOGL2.0之MyeclipsE/EclipsE配置 关于JOGL2.0的配置,在MYECLIPSE中成功配置。现将配置方法予以图片形式共享。 第一步:下载jogl-2.0-windows-i586.zip 第二步:解压ZIP 朴灿烈づ我的快乐病毒、/ 2022年01月10日 23:23/ 0 赞/ 144 阅读
相关 JOGL 有许多用Java去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGL的绑定(Java Bindings for OpenGL),或者称为JOGL。 悠悠/ 2022年01月10日 23:11/ 0 赞/ 56 阅读
还没有评论,来说两句吧...