没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Java 程序中的 OpenGL(JOGL 学
习教程)
一、绘图模型和图形库
图形显示器就是一块由许多像素点组成的绘图区域,图形系统的核心就是一支魔法画笔,
这支画笔能以非常快的速度移动到一个确定的像素点并且在这个像素点绘制一种确定的颜
色——颜色由 RGB 值指定。这支笔能直接被一些输入设备(鼠标或键盘)控制,就像一个
简易的画刷一样。这样我们就能画任何我们所想象的东西,但是这就需要一个真正的艺术家
来,才能画出好的图画。然而计算机图形是通过程序来自动的使用这支笔。
一个真实的或是想象中的物体在计算机中表示为一种模型,并且显示为图像。模型就是
对物体的形状和颜色做抽象的描述,它能找到物体上所有的点和这些点的颜色(相当于绘图
区域上的像素)。给出一个模型,应用程序将会通过图形库控制画笔形成相应的图像,这是
由一些像素组成的简单的 2D 图像。
图形库提供了一系列的绘图命令和函数。这些命令能在不同的平台和 C,C++,Java 或
是其他的编程语言绑定。绘图命令能够将原始的 2D,3D 的几何模型数字化并显示,这里
“原始的几何模型”指的是能够被图形库所接受的某些简单的形状(例如点,直线,多边
形)。要想画复杂的图形,我们就需要程序来组合和构造这些简单的形状。我们现在已经拥
有能绘制像素的画笔,一旦我们能绘制像素,那我们就能绘制直线,多边形,弧线,街区,
建筑物,飞机等等。一个普通的程序能够通过图形库的绘图命令绘制出复杂的形状。由于我
们的画笔非常之快,所以我们能绘制复杂的物体。清空绘图区域,将物体以不同的形状在不
同的地方画出来,并且不断地重复上述过程,那么我们的物体就形成了动画。
我们将会将 Java 语言和 OpenGL 结合起来介绍图形理论。当我们讲到程序实例的时候,
我们将会像 C/C++程序员那样来简单的讨论一下 Java 所特有的理念。
二、Java 程序中的 OpenGL(初识 JOGL)
OpenGL 是应用最广泛的图形库,支持所有的流行的平台,且能确保项目能正确部署。
JOGL 实现了 Java 和 OpenGL 的绑定,它给 Java 的 3D 绘图提供了硬件支持。它是有 sun 公
司的游戏技术组织发起的一套开源技术。JOGL 结合 AWT 和 SWING 的组件能完全访问
OpenGL 的函数。
2.1、第一个 JOGL 程序
JOGL 程序要与 awt 或 swing 结合,第一个程序我们要使用到的类并不多,主要有以下
几个:
·GL2:这是一个接口,是用来调用 OpenGL 函数的,这个接口对象的取得下面会讲到
·GLCanvas:这是一个类,是一个支持 OpenGL 的重量级的 AWT 组件,通过监听 GL 事
件来绘制图形。
·GLAutoDrawable:这是一个接口,用来获得 GL2 接口对象的。
范例:第一个 JOGL(画一个矩形)熟悉 JOGL 流程
package fuhao;
import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
public class OpenGL implements GLEventListener{
private GL2 gl;
@Override
public void init(GLAutoDrawable drawable) {
gl = drawable.getGL().getGL2();
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
@Override
public void display(GLAutoDrawable drawable) {
gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
gl.glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
gl.glFlush();
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width,
int height) {
}
public static void main(String[] args) {
GLCanvas canvas = new GLCanvas(new
GLCapabilities(GLProfile.get(GLProfile.GL2)));
OpenGL opengl = new OpenGL();
canvas.addGLEventListener(opengl);
canvas.setSize(500,500);
JFrame frame = new JFrame("第一个 JOGL 程序");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(canvas);
frame.setSize(frame.getContentPane().getPreferredSize());
frame.setVisible(true);
}
}
在主方法中,创建一个 GLCanvas 对象 canvas,一个 JFrame 对象 frame,把 canvas 加到
frame 中,并给他们设置尺寸。而想让自己绘制的东西出现在 canvas 上,就必须为 canvas
添加 GL 监听事件(GLEventListener),我们编写的 OpenGL 类实现了 GLEventListener 接口。
所以为 canvas 添加 OpenGL 对象作为监听事件即可,而我们的绘图程序就写在 OpenGL 中的
display()方法之中,这个方法是实现了 GLEventListener 中的抽象方法。
OpenGL 类要实现如下几个抽象方法:
所有的方法都是由 GLAutoDrawable 接口对象触发的
public void init(GLAutoDrawable drawable);
GLAutoDrawable 接口对象创建的时候被调用,而这个接口对象是在 GLCanvas 对象
加入窗口部件时自动创建的。这个方法可以被多次调用,例如:GLCanvas 对象从窗口
部件中移除了然后再次加入。
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
当组件的大小尺寸被改变时候调用,第一次绘制的时候也会调用。
public void display(GLAutoDrawable drawable);
在 reshape 之后调用
public void dispose(GLAutoDrawable drawable);
在 GLCanvas 对象从窗口部件中移除的时候调用,清理回收资源
2.2、原始的几何模型(点,直线,多边形)
上面已经提到过,OpenGL 能将原始的几何模型数字化,所谓数字化就是将其用像素来
构成,而 OpenGL 能对像素进行各种操作,例如设置颜色。
在几何学中,点是没有大小的,而 OpenGL 中像素是不可能无限小的,它总有一个大小,
而点一般就由一个像素来表示;
同样,几何学中直线是没有宽度的,但是 OpenGL 中的直线则是有宽度的,而且 OpenGL
中的直线必须是有限长,不能无限长,可以将 OpenGL 中的直线理解为数学中的线段,它是
由两个端点决定的。
多边形则是由多条线段首位相连形成的封闭图形,OpenGL 规定多边形必须为凸多边形,
多边形是由其定点决定的。
OpenGL 提供了一系列函数绘制点,他们都是以 glVertex 开头。例如:
·glVertex2d
·glVertex2f
·glVertex3f
·glVertex3fv
等等。
后面的数字代表参数的个数,字母代表参数类型,d 是 double,f 是 float,i 是 int,v
是指传参数时将以数组的形式传递。
所有的原始几何模型的绘制代码都必须在这两行之间,glBegin()和 glEnd()。如果要绘制
的图形需要用到多种模型,可以用多组 glBegin(),glEnd()。
glBegin()的参数是用来选择几何模型
glBegin()参数:
·GL_POINTS:画点
·GL_LINES:每两个点连成一条直线,按顺序连接,若点的个数为奇数个,则最后
一个点没有点连接直线
·GL_LINE_STRIP:按点的顺序连接折线,首尾不相连
·GL_LINE_LOOP:按点的顺序连接折线,首尾相连
·GL_POLYGON:按点的顺序连接成多边形
等等
范例:绘制点(修改上述代码中的 display()方法)
public void display(GLAutoDrawable drawable) {
gl.glBegin(GL2.GL_POINTS);
gl.glVertex2f(0.0f, 0.0f);
gl.glEnd();
}
由于一个像素比较小,看不清楚
范例:绘制直线
public void display(GLAutoDrawable drawable) {
gl.glBegin(GL2.GL_LINES);
gl.glVertex2f(0.0f, 0.0f);
gl.glVertex2f(0.5f, 0.5f);
gl.glEnd();
}
范例:绘制多边形
public void display(GLAutoDrawable drawable) {
gl.glBegin(GL2.GL_POLYGON);
gl.glVertex2f(0.0f, 0.0f);
gl.glVertex2f(0.5f, 0.5f);
gl.glVertex2f(0.0f, 0.5f);
gl.glEnd();
}
2.3、原始几何模型绘制复杂图形
2.3.1、圆
圆的面积可由多边形面积无限接近,也就是说我们可以用绘制多边形的方式来绘制圆。
有了这个想法之后,实现就很简单了,我们只需要将多边形的边无限增多就行了,当然无限
剩余45页未读,继续阅读
资源评论
Bricke
- 粉丝: 414
- 资源: 370
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功