📜  JOGL 3D三角形(1)

📅  最后修改于: 2023-12-03 14:43:07.142000             🧑  作者: Mango

JOGL 3D三角形

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功能进行渲染和光照。