当前位置: 首页 > 工具软件 > JOGL > 使用案例 >

《jogl简明教程》学习笔记1

司徒高寒
2023-12-01
jogl的资料是在是太少了,找了将近一个月,几乎看到的都是《jogl简明教程》,中文的教程完全就没有
是在没有办法只能硬着头皮用这本书了。不过在看jogl之前看看opengl的书(推荐《红宝书》)还是非常有用的

这里对《jogl简明教程》书里的内容做一些学习记录
首先创建一个窗口,opengl的绘图需要一个窗口,c里面有glut,java目测只能自己写(我看nehe的教程也是自己写的)。

原书用的是awt的Frame,我自己改成了JFrame。

原书代码放在最后

这段代码是书里第一个程序,算是jogl的HelloWorld!
首先用awt(swing)创建了窗口,同时继承了监听借口
然后把画布添加到frame里面,这个画布会随着frame改变而改变
init用于初始化
display用于绘制图形
reshap当窗口状态改变是执行
displaychanged当显示模式或者显示设备改变是执行,通常不使用

整体感觉和c语言下的opengl没有太大变化。

p.s:jogl下的方法大多数都有gl前缀


原书代码
import java.awt.*;

// JOGL: OpenGL functions
import javax.media.opengl.*;
import javax.swing.JFrame;
public class J1_0_Point extends JFrame implements
    GLEventListener {
  static int HEIGHT = 600, WIDTH = 600;
  static GL gl; //interface to OpenGL
  static GLCanvas canvas; // drawable in a frame
  static GLCapabilities capabilities;
  public J1_0_Point() {
    //1. specify a drawable: canvas
    capabilities = new GLCapabilities();
    canvas = new GLCanvas(); 
    //2. listen to the events related to canvas: reshape
    canvas.addGLEventListener(this);
    //3. add the canvas to fill the Frame container
    add(canvas, BorderLayout.CENTER);
    //4. interface to OpenGL functions
    gl = canvas.getGL();
  }
  public static void main(String[] args) {
    J1_0_Point frame = new J1_0_Point();
    //5. set the size of the frame and make it visible
    frame.setSize(WIDTH, HEIGHT);
    frame.setVisible(true);
  }
  // called once for OpenGL initialization
  public void init(GLAutoDrawable drawable) {
    //6. specify a drawing color: red
    gl.glColor3f(1.0f, 0.0f, 0.0f);
  }
  // called for handling reshaped drawing area
  public void reshape(
      GLAutoDrawable drawable,
      int x,
      int y,
      int width,
      int height) {
      WIDTH = width; // new width and height saved
      HEIGHT = height;
    //7. specify the drawing area (frame) coordinates
    gl.glMatrixMode(GL.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrtho(0, width, 0, height, -1.0, 1.0);
  }
  // called for OpenGL rendering every reshape
  public void display(GLAutoDrawable drawable) {
    //8. specify to draw a point
    //gl.glPointSize(10);
    gl.glBegin(GL.GL_POINTS);
    gl.glVertex2i(WIDTH/2, HEIGHT/2);
    gl.glEnd();
  }
  // called if display mode or device are changed
  public void displayChanged(
      GLAutoDrawable drawable,       boolean modeChanged,
      boolean deviceChanged) {
  }
}
 类似资料: