JAVA的OPENGL,JOGL入门例子----碰撞移动的正方体

第一步:到https://jogl.dev.java.net/  下载 jogl-1.1.2-pre-20080523-windows-i586.zip
 
解压缩到随意文件夹里,如:C:/Program Files/Java/jogl-1.1.2-pre-20080523-windows-i586
 
打开eclipse, 点FILE-->new--->project--->project name 随意写如:My_opengl----FINISH
 
     建立项目以后在左边Workspace里找到刚新建的项目

      如:My_opengl,鼠标右键-->properties-->Java Build Path 选 libraries--->Add External JARs
 
       找到原解压缩文件夹 如:C:/Program Files/Java/jogl-1.1.2-pre-20080523-windows-i586 

        在里面找到lib,打开--->双击jogl.jar和gluegen-rt.jar  把这2个JAR包添加到我们的 libraries
 
         这时能在libraries里看到jogl.jar和gluegen-rt.jar 两包,选jogl.jar,
 
          ---> Native library location:---->Edit--->External Folder
 
           -->选择C:/Program Files/Java/jogl-1.1.2-pre-20080523-windows-i586/lib
 
           这样配置就完成了。
 
 
 
       

在My_opengl项目里,新建一个CLASS,CLASS NAME:Opengl_Bounce
 
先Ctrl+C复制下面代码到CLASS里,

import java.awt.BorderLayout;            

import java.awt.Frame;
 
import java.awt.HeadlessException;
 
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;
 
 
 
 
 
public class Opengl_Bounce extends Frame implements GLEventListener, Runnable {
 
 
 
     float x1 = 100.0f;             //矩型的X坐标 

     float y1 = 150.0f;             //矩型的y坐标
 
 
 
     long rsize = 50;               //为矩型宽度预留的位置或距离
 
 
 
     float xstep = 1.0f;            //沿X每步位移的距离,当然可以改大些
 
     float ystep = 1.0f;            //沿Y每步位移的距离
 
 
 
     float windowWidth;             //这里不是指窗体边框的的宽,而是视觉投影的右端
 
     float windowHeight;            //这里不是指窗体边框的的高,而是视觉投影的顶端
 
 
 
     GL gl;                         //OPENGL的主接口
 
     GLCanvas glcanvas;             //类似java.awt.Canvas, GLCanvas主要用来显示各种OPENGL的效果
 
     GLCapabilities capabilities;   //指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。 

 
 
     Thread myThread = new Thread(this);
 
 
 
     public Opengl_Bounce() throws HeadlessException {       

 
 
         this.capabilities = new GLCapabilities();        //实例化capabilities
 
         this.glcanvas = new GLCanvas(capabilities);      //实例化glcanvas
 
         this.glcanvas.addGLEventListener(this);          //给glcanvas添加GL事件处理
 
         this.add(glcanvas, BorderLayout.CENTER);         //给窗体添加一个Component:glcanvas
 
         this.addWindowListener(new WindowAdapter() {     //给窗体添加关闭事件
 
 
 
 
 
              public void windowClosing(WindowEvent e) {
 
                   System.exit(0);
 
              }
 
 
 
         });
 
 
 
 
 
         myThread.start();                                //主线程开始
 
 
 
 
 
     }
 
 
 
     public static void main(String[] args) {             

         Opengl_Bounce f = new Opengl_Bounce();
 
         f.setTitle("移动的矩型");
 
         f.setSize(800, 600);
 
         f.setVisible(true);
 
 
 
     }
 
 
 
     

 
 
     public void display(GLAutoDrawable drawable) {
 
 
 
         if (x1 > windowWidth - rsize || x1 < 0) {
 
              xstep = -xstep;
 
         }
 
         if (y1 > windowHeight - rsize || y1 < 0) {
 
              ystep = -ystep;
 
         }
 
 
 
         if (x1 > windowWidth - rsize) {
 
              x1 = windowWidth - rsize;
 
         }
 
         if (y1 > windowHeight - rsize) {
 
              y1 = windowHeight - rsize;
 
         }
 
 
 
         x1 += xstep;
 
         y1 += ystep;
 
 
 
 
 
 
 
         gl.glClear(GL.GL_COLOR_BUFFER_BIT);
 
         gl.glColor3f(1.0f, 0.0f, 0.0f);
 
 
 
         gl.glRectf(x1, y1, x1 + rsize, y1 + rsize);
 
 
 
         gl.glFlush();
 
         glcanvas.swapBuffers();
 
 
 
     }
 
 
 
     public void displayChanged(GLAutoDrawable drawable, boolean arg1,
 
              boolean arg2) {
 
 
 
     }
 
 
 
     public void init(GLAutoDrawable drawable) {
 
         gl = drawable.getGL();
 
         gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
 
 
 
     }
 
 
 
     public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
 
         if (h == 0) {
 
              h = 1;
 
         }
 
         gl.glViewport(0, 0, w, h);
 
         gl.glMatrixMode(GL.GL_PROJECTION);
 
         gl.glLoadIdentity();
 
 
 
         if (w <= h) {
 
              this.windowWidth = 250.0f;
 
              this.windowHeight = 250.0f * h / w;
 
         } else {
 
              this.windowWidth = 250.0f * w / h;
 
              this.windowHeight = 250.0f;
 
 
 
         }
 
 
 
         gl.glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
 
         gl.glMatrixMode(GL.GL_MODELVIEW);
 
         gl.glLoadIdentity();
 
 
 
     }
 
 
 
     public void run() {
 
         while (true) {
 
 
 
              glcanvas.display();                  //主线程不停调用display() 
 
              try {
 
                   myThread.sleep(20);             //每执行完一次休息20毫秒
 
              } catch (InterruptedException ex) {
 
                   ex.printStackTrace();
 
              }
 
 
 
         }
 
 
 
     }
 
 
 
}


先不谈Runnable接口,这是个多线程接口,
 
我们直接看到上面代码里我们 implements GLEventListener ,这用于声明一个客户端代码管理OpenGL渲染的事件.
 
GLEventListener 接口里有4个方法必须被重写(当然不是让你重新写一次,eclipse会自动提示你加载这些方法):

public void init(GLAutoDrawable drawable)   程序初试化时被调用 

    public void display(GLAutoDrawable drawable)  //作为画图的动作被调用,也就是主画图函数
 
    {
 
 
 
         if (x1 > windowWidth - rsize || x1 < 0) {    当矩型的X坐标大于视图的最右边或小于0时,沿X移动方向取反
 
 
 
        

    }
 
    public void displayChanged(GLAutoDrawable drawable, boolean arg1,boolean arg2)   //当DisplayMode被改变的时候自动被调用
 
 
 
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) 
 
    {
 
       

    }  //当屏幕尺寸发生改变的时候调用,一开始就会至少会被调用一次.
 




最终效果
 




 
 
 
 
 
 

              xstep = -xstep;
 
         }
 
         if (y1 > windowHeight - rsize || y1 < 0) {   当矩型的y坐标大于视觉的最右边或小于0时,沿Y移动方向取反
 
              ystep = -ystep;
 
         }
 
 
 
         if (x1 > windowWidth - rsize) {              当矩型的X坐标到达视图的最右边,先停止
 
              x1 = windowWidth - rsize;
 
         }
 
         if (y1 > windowHeight - rsize) {             当矩型的Y坐标到达视图的最右边,先停止
 
              y1 = windowHeight - rsize;
 
         }
 
 
 
         x1 += xstep;                                 沿X坐标执行的位移距离                         

         y1 += ystep;                                 沿Y坐标执行的位移距离
 
 
 
 
 
 
 
         gl.glClear(GL.GL_COLOR_BUFFER_BIT);         在init()中曾把背景色设为蓝,在这里还要实际清除一下
 
         gl.glColor3f(1.0f, 0.0f, 0.0f);             设置画笔颜色为红
 
 
 
         gl.glRectf(x1, y1, x1 + rsize, y1 + rsize);   画矩型,坐标为(x1,y1)
 
 
 
         gl.glFlush();                               刷新
 
         glcanvas.swapBuffers();                     更新前景缓冲和背景缓冲
 

    {
 
 
 
         gl = drawable.getGL();                用drawable设备获取到GL接口,这句为必须,否则报错
 
         gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);     把当前背景清除颜色设为蓝RGB(0,0,1),之前系统默认为黑
 
 
 
 
 
    }

转自:http://blog.csdn.net/wjyjimy2/article/details/4055350

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值