由于出了JOGL 2.0,代码应用上和JOGL 1.0多少有点区别,研究了一下,做了个基于JOGL2的例子
JOGL 2.0 for netbeans 下载地址,感谢网友wei495715356提供的地址和包
http://projectkenai.com/projects/netbeans-opengl-pack/downloads/directory/early-access
其实JOGL2.0在代码上和JOGL1.0相差不大.
图一:
图二:
窗体类:
package org.yourorghere; //要是想使用默认包,请去掉这行
/**
*
* @欢迎来到子瑜IT博客空间
*
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.media.opengl.*;
import com.sun.opengl.util.Animator;
import com.sun.opengl.util.FPSAnimator;
import javax.media.opengl.awt.GLCanvas;
public class SolarMain extends JFrame {
GLRender listener=new GLRender();
static FPSAnimator animator=null;
public SolarMain() throws HeadlessException {
super("太阳与地球");
setSize(600,480);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GLCapabilities glcaps=new GLCapabilities(null); //这里和之前章节的代码有区别.
GLCanvas canvas=new GLCanvas(glcaps);
canvas.addGLEventListener(listener);
//canvas.addMouseListener(listener);
getContentPane().add(canvas, BorderLayout.CENTER);
animator=new FPSAnimator(canvas,60,true);
centerWindow(this);
}
private 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);
}
public static void main(String[] args) {
final SolarMain app = new SolarMain();
// 显示窗体
SwingUtilities.invokeLater(new Runnable() {
public void run() {
app.setVisible(true);
}
});
// 动画线程开始
SwingUtilities.invokeLater(new Runnable() {
public void run() {
animator.start();
}
});
}
}
GL控制类:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.yourorghere;
import com.sun.opengl.util.gl2.GLUT; //这里类所在包改变了
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU; //这里类所在包改变了
/**
*
* @欢迎来到子瑜IT博客空间
*
*/
public class GLRender implements GLEventListener {
GL2 gl;
GLU glu;
GLUT glut;
float whiteLight[] = {0.2f, 0.2f, 0.2f, 1.0f};
float sourceLight[] = {0.8f, 0.8f, 0.8f, 1.0f};
float lightPos[] = {0.0f, 0.0f, 0.0f, 1.0f};
float fMoonRot = 0.0f;
float fEarthRot = 0.0f;
public void init(GLAutoDrawable drawable) {
gl = drawable.getGL().getGL2(); //主要就是这里发生变化
glu = new GLU();
glut=new GLUT();
// Light values and coordinates
gl.glEnable(GL.GL_DEPTH_TEST); // 启用深度测试
gl.glFrontFace(GL.GL_CCW); //设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
gl.glEnable(GL.GL_CULL_FACE); //用GL_CULL_FACE符号常量调用glEnable函数表示开启多边形表面剔除功能
// 启用灯光
gl.glEnable(GL2.GL_LIGHTING);
// 设置灯光
gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, whiteLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, sourceLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPos, 0);
gl.glEnable(GL2.GL_LIGHT0);
// 启用材质
gl.glEnable(GL2.GL_COLOR_MATERIAL);
// 决定对物体的正面还是反面,对环境光、镜面光还是漫射光进行颜色跟踪。
//第一个参数可以取GL_FRONT、GL_BACK、GL_FRONT_AND_BACK中的任意一种,
//第二个参数可以取GL_AMBIENT、GL_DIFFUSE、GL_AMBIENT_AND_DIFFUSE、GL_SPECULAR中的任意一种。
gl.glColorMaterial(GL.GL_FRONT, GL2.GL_AMBIENT_AND_DIFFUSE);
// 黑色背景
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void display(GLAutoDrawable drawable) {
// 填充背景为背景颜色
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// 保存矩阵状态和做旋转
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glPushMatrix();
// 画图点移动到Z里300的位置,负为向里,正为向程序员.
gl.glTranslatef(0.0f, 0.0f, -300.0f);
// Set material color, Red
// 太阳
gl.glDisable(GL2.GL_LIGHTING);
gl.glColor3ub((byte)255, (byte)255, (byte)0);
glut.glutSolidSphere(15.0f, 30, 17);
gl.glEnable(GL2.GL_LIGHTING);
// 重新设置灯光到太阳的位置
gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,lightPos,0);
// 围绕Y轴旋转矩阵
gl.glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
// 画地球
gl.glColor3ub((byte)0,(byte)200,(byte)255);
gl.glTranslatef(105.0f,0.0f,0.0f);
glut.glutSolidSphere(15.0f, 30, 17);
//围绕Y轴旋转矩阵,当前旋转中心为地球,被旋转的是月球
gl.glColor3ub((byte)200,(byte)200,(byte)200);
gl.glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
gl.glTranslatef(30.0f, 0.0f, 0.0f);
fMoonRot+= 15.0f;
if(fMoonRot > 360.0f)
fMoonRot = 0.0f;
glut.glutSolidSphere(6.0f, 30, 17);
// 还原状态矩阵
gl.glPopMatrix(); // Modelview matrix
//地球轨道每步5度,旋转度数
fEarthRot += 2.0f;
if(fEarthRot > 360.0f)
fEarthRot = 0.0f;
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
float fAspect;
// 防止为零
if (height == 0) {
height = 1;
}
//视口设置为窗口尺寸
gl.glViewport(0, 0, width, height);
fAspect = (float) width / height;
// Reset projection matrix stack
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
//透视投影 眼角度,比例,近可视,远可视
glu.gluPerspective(53.0f, fAspect, 1.0, 400.0);
// 重置模型观察矩阵堆栈
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void dispose(GLAutoDrawable arg0) {
}
}
顺便发上JOGL2 FOR eclipse插件 jogl-2.0-windows-i586.zip
分享自己的技术论坛http://www.itneng.com/forum.php