jogl基础入门学习
来源:互联网 发布:node 跨域请求 编辑:程序博客网 时间:2024/05/22 14:49
1、jogl是什么?
jogl是Java OpenGL的简称,想真正的了解它,就需要了解OpenGL,OpenGL是Open Graphics Library,它是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,请参考http://baike.baidu.com/view/9222.htm,他其实是一个命令的的集合,300多条,算不上编程语言,他最难的在于计算机图形学的知识,而jogl是用java通过jni调用,对openGL的一个封装,所以速度上并不比c慢多少,并且加上java特有的面向对象的特性,来开发游戏比直接用c有过之而无不及!
2、jogl的安装配置;
下载地址:如果去官方下载,就直接在他的svn中checkout下来,去里面的项目找, http://jogl.dev.java.net,
为了方便我直接上传了一份;
eclipse下配置:jar包放在build-path下,dll文件,可以在项目下建立个native文件夹,把jogl.jar的NativeLibraryLocation位置选中native就行了。(召唤美女军团)
3、验证配置,可以用下面代码
- public class Validate {
- public static void main(String[] args) {
- try {
- System.loadLibrary("jogl");
- System.out.println("正确配置");
- } catch (Exception e) {
- System.out.println("没有正确配置:" + e.getMessage());
- }
- }
- }
没有正确配置的话会有下面异常
- Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path
- at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
- at java.lang.Runtime.loadLibrary0(Runtime.java:823)
- at java.lang.System.loadLibrary(System.java:1030)
- at org.ligson.jogl.test.Validate.main(Validate.java:7)
4、OpenGL开发前需要知道的
OpenGL为了兼容各种环境,没有实现窗口,但是他画图又必须在窗口下画,在C库中依赖于glut,在Java中就依赖于swing了,所以第一步应该建立一个窗口extends JFrame,
5、先看一个Hello,World!
- package org.ligson.jogl.test;
- import java.awt.BorderLayout;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import javax.media.opengl.GL;
- import javax.media.opengl.GLAutoDrawable;
- import javax.media.opengl.GLCanvas;
- import javax.media.opengl.GLCapabilities;
- import javax.media.opengl.GLEventListener;
- import javax.swing.JFrame;
- public class Pointer extends JFrame implements GLEventListener, Runnable {
- // gl库的handler,相当于画笔
- GL gl;
- // 画布,跟html5的Canvas一样,
- GLCanvas canvas;
- // 指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。
- GLCapabilities capabilities;
- Thread thread = new Thread(this);
- public Pointer() {
- super("Demo4");
- this.setSize(500, 500);
- this.setLocationRelativeTo(null);
- capabilities = new GLCapabilities();
- canvas = new GLCanvas(capabilities);
- canvas.addGLEventListener(this);
- this.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- System.exit(0);
- }
- });
- this.add(canvas, BorderLayout.CENTER);
- thread.start();
- }
- @Override
- public void run() {
- while (true) {
- try {
- Thread.sleep(20);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- canvas.display();
- }
- }
- @Override
- public void display(GLAutoDrawable drawable) {
- gl.glClear(GL.GL_COLOR_BUFFER_BIT);
- gl.glColor3f(1.0f, 0.0f, 0.0f);
- gl.glPointSize(10.0f);
- gl.glBegin(GL.GL_POINTS);
- gl.glVertex3f(50.0f, 50.0f, 50.0f);
- gl.glEnd();
- gl.glFlush();
- }
- @Override
- public void displayChanged(GLAutoDrawable drawable, boolean arg1,
- boolean arg2) {
- }
- @Override
- public void init(GLAutoDrawable drawable) {
- gl = drawable.getGL();
- gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
- }
- @Override
- public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
- if (h == 0) {
- h = 1;
- }
- int windowWidth;
- int windowHeight;
- gl.glViewport(0, 0, w, h);
- gl.glMatrixMode(GL.GL_PROJECTION);
- gl.glLoadIdentity();
- if (w <= h) {
- windowWidth = 250;
- windowHeight = 250 * h / w;
- } else {
- windowWidth = 250 * w / h;
- windowHeight = 250;
- }
- gl.glOrtho(0 - windowWidth, windowWidth, 0 - windowHeight,
- windowHeight, 250.0f, -250.0f);
- gl.glMatrixMode(GL.GL_MODELVIEW);
- gl.glLoadIdentity();
- }
- public static void main(String[] args) {
- Pointer demo5 = new Pointer();
- demo5.setVisible(true);
- }
- }
6、上面的hello,world吓住你了吗?太长了吧,我刚开始跟你一样!先说上面是干嘛的?他其实就是先空间画一个10.0f像素的点(glPonitSize(10.0f));了解几个函数
- public void init(GLAutoDrawable drawable) {
初始化时调用,给GL 赋值
- @Override
- public void display(GLAutoDrawable drawable) {
每次显示时都会调用的,他一般在一个线程里,不停的画,因为他只显示一次,当屏幕进行刷新时就没有了,
- @Override
- public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
当窗口大小进行改变时调用,初次显示也算,
- @Override
- public void displayChanged(GLAutoDrawable drawable, boolean arg1,
- boolean arg2) {
显示改变时调用,,具体的不知道,我也没有用过
7、后续。。。。。。
- jogl基础入门学习
- jogl入门
- jogl入门
- jogl
- JOGL
- JOGL
- JOGL
- jogl学习起步(一)
- JOGL学习-1 JOGL配置方法(zz)
- jogl入门之简单的贪吃蛇
- 《jogl简明教程》学习笔记1
- 《jogl简明教程》学习笔记2
- 《jogl简明教程》学习笔记3
- 《jogl简明教程》学习笔记4
- JAVA的OPENGL,JOGL入门例子----碰撞移动的正方体
- JAVA的OPENGL,JOGL入门例子----碰撞移动的正方体
- Dos学习基础入门
- NumPy基础入门学习
- iphone-common-codes-ccteam源代码 CCInfoPlistFileReader.h
- 函数对象
- Android Phone类讲解
- iphone-common-codes-ccteam源代码 CCInfoPlistFileReader.m
- iphone-common-codes-ccteam源代码 CCKeyboard.h
- jogl基础入门学习
- iphone-common-codes-ccteam源代码 CCKeyboard.m
- googlemap开发总结(googlemap apiv3 inforwindow样式的自定义)
- iphone-common-codes-ccteam源代码 CCLanguage.h
- iphone-common-codes-ccteam源代码 CCLanguage.m
- 基于WINPCAP的GOOSE报文捕获分析工具开发
- iphone-common-codes-ccteam源代码 CCLog.h
- UML实践----用例图、顺序图、状态图、类图、包图、协作图
- iphone-common-codes-ccteam源代码 CCLog.m