JAVA的OPENGL,JOGL入门实例----碰撞移动的正方体 (配置+源代码)

我的配置方法:

下载jogl-1.1.1a-windows-i586.zip,(链接失效的话可以到qq群336280109里群文件共享下载)(http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/)解压后找出lib中的四个dll文件,复制到C盘windows/system32下面(其实放在PATH环境变量里面的任一个文件夹下都是可以的),然后在工程新建文件夹lib,把解压得到的两个jar复制到新建的lib,然后build path。

在上面的网址中下载jogl-1.1.1a-src.zip ,把这个zip也复制到工程新建的lib中,然后ctrl+shift+T,输入GLEventListener,再点击attach,选择这个zip文件,以后就可以看到源码了。

import javax.media.opengl.GLCapabilities;

public class HelloWorld {

	public static void main(final String args[]) {
		try {
			System.loadLibrary("jogl");
			System.out.println("Hello World!(Thenativelibrariesareinstalled.)");
			final GLCapabilities caps = new GLCapabilities();
			System.out.println("Hello JOGL!(Thejarappearstobeavailable.)");
		} catch (final Exception e) {
			System.out.println(e);
		}
	}
}


然后按照上面的测试代码测试。

实例源代码:http://blog.csdn.net/xxyy888/article/details/8211380

package test1.opengl;

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 {

		capabilities = new GLCapabilities(); // 实例化capabilities

		glcanvas = new GLCanvas(capabilities); // 实例化glcanvas

		glcanvas.addGLEventListener(this); // 给glcanvas添加GL事件处理

		this.add(glcanvas, BorderLayout.CENTER); // 给窗体添加一个Component:glcanvas

		addWindowListener(new WindowAdapter() { // 给窗体添加关闭事件

			@Override
			public void windowClosing(final WindowEvent e) {

				System.exit(0);

			}

		});

		myThread.start(); // 主线程开始

	}

	public static void main(final String[] args) {

		final Opengl_Bounce f = new Opengl_Bounce();

		f.setTitle("移动的矩型");

		f.setSize(800, 600);

		f.setVisible(true);

	}

	@Override
	public void display(final 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();

	}

	@Override
	public void displayChanged(final GLAutoDrawable drawable, final boolean arg1,

	final boolean arg2) {

	}

	@Override
	public void init(final GLAutoDrawable drawable) {

		gl = drawable.getGL();

		gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

	}

	@Override
	public void reshape(final GLAutoDrawable drawable, final int x, final int y, final 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) {

			windowWidth = 250.0f;

			windowHeight = 250.0f * h / w;

		} else {

			windowWidth = 250.0f * w / h;

			windowHeight = 250.0f;

		}

		gl.glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);

		gl.glMatrixMode(GL.GL_MODELVIEW);

		gl.glLoadIdentity();

	}

	@Override
	public void run() {

		while (true) {

			glcanvas.display(); // 主线程不停调用display()

			try {

				myThread.sleep(20); // 每执行完一次休息20毫秒

			} catch (final InterruptedException ex) {

				ex.printStackTrace();

			}

		}

	}

}


ok了!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值