📅  最后修改于: 2023-12-03 14:43:07.142000             🧑  作者: Mango
JOGL(Java Bindings for OpenGL)是一个Java实现的开放图形库(OpenGL)绑定。它提供了在Java平台上使用OpenGL的API,使得Java程序员可以利用OpenGL强大的功能进行2D和3D图形编程和游戏开发。在这篇文章中,我们将学习如何使用JOGL创建简单的3D三角形。
import java.awt.*;
import java.awt.event.*;
import java.nio.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
public class JOGLTriangle implements GLEventListener, KeyListener {
private GL gl;
private GLU glu;
private float rtri = 0.0f;
private FloatBuffer vertexBuffer;
private FloatBuffer colorBuffer;
public void init(GLAutoDrawable gld) {
gl = gld.getGL();
glu = new GLU();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, 640.0/480.0, 0.1f, 100.0f);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
initBuffers();
gld.addKeyListener(this);
}
public void display(GLAutoDrawable drawable) {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertexBuffer);
gl.glColorPointer(3, GL.GL_FLOAT, 0, colorBuffer);
gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
update();
}
private void update() {
rtri += 0.2f;
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
height = (height == 0) ? 1 : height;
float aspect = (float)width / height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, aspect, 0.1f, 100.0f);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
private void initBuffers() {
float[] vertices = { 0.0f, 1.0f, 0.0f, // Top
-1.0f, -1.0f, 0.0f, // Bottom Left
1.0f, -1.0f, 0.0f // Bottom Right
};
float[] colors = { 1.0f, 0.0f, 0.0f, // Red
0.0f, 1.0f, 0.0f, // Green
0.0f, 0.0f, 1.0f // Blue
};
vertexBuffer = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertices).rewind();
colorBuffer = ByteBuffer.allocateDirect(colors.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
colorBuffer.put(colors).rewind();
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
System.exit(0);
}
}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public static void main(String[] args) {
Frame frame = new Frame("JOGL 3D Triangle");
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new JOGLTriangle());
frame.add(canvas);
frame.setSize(640, 480);
final Animator animator = new Animator(canvas);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
new Thread(new Runnable() {
public void run() {
animator.stop();
System.exit(0);
}
}).start();
}
});
frame.setVisible(true);
animator.start();
}
}
这段代码使用JOGL创建和显示一个简单的3D三角形。首先,我们需要导入Java的awt、nio、gl和glu库,以及com.sun.opengl.util包。JOGL的API源自OpenGL,所以我们使用OpenGL库创建所需的OpenGL背景和上下文。
import java.awt.*;
import java.nio.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
我们创建了JOGLTriangle类作为我们的主类。该类实现了GLEventListener和KeyListener接口,GLEventListener对应于OpenGL界面的创建和显式,KeyListener用于检测用户输入。
public class JOGLTriangle implements GLEventListener, KeyListener {
我们需要创建一些变量来管理OpenGL环境,并在需要时进行更新。其中,rtri变量用于以旋转的方式更新三角形的角度。
private GL gl;
private GLU glu;
private float rtri = 0.0f;
在init()函数中,我们为OpenGL环境设置参数,例如视野,深度缓存和顶点和颜色数组。我们创建了一个FloatBuffer和一个ColorBuffer来存储顶点和颜色。我们还将键盘侦听器添加到GLAutoDrawable对象,以检测用户输入。
public void init(GLAutoDrawable gld) {
gl = gld.getGL();
glu = new GLU();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, 640.0/480.0, 0.1f, 100.0f);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
initBuffers();
gld.addKeyListener(this);
}
display()方法用于显示三角形。首先,我们清除深度和颜色缓冲区,并将矩阵模式设置为模型视图。我们设置三角形的位置和旋转,启用客户端状态并绘制三角形。
public void display(GLAutoDrawable drawable) {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertexBuffer);
gl.glColorPointer(3, GL.GL_FLOAT, 0, colorBuffer);
gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
update();
}
我们还有一些辅助方法,例如update()和reshape(),这些方法用于更新我们的三角形,设置视口和透视投影等等。最后,我们定义了一个main()函数来启动我们的程序。
这个简单的JOGL程序创建了一个3D三角形。虽然这个程序非常简短,但是它展示了如何使用JOGL API在Java平台上创建和显示OpenGL图形。我们可以使用JOGL实现更复杂的3D图形,并使用其他OpenGL功能进行渲染和光照。