2013-05-01 55 views
3

我從here下載JOGL 2.0,文件jogl-all.jar,跑從here採取一個簡單的代碼示例:JOGL 2.0不支持GLCanvas,Texture,Animator,但是jogl 1.0呢?

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

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; 
import javax.swing.JFrame; 

import com.sun.opengl.util.Animator; 

/** 
* This is a simple example for the method 
* 
* glNormal(); 
* 
* 
* Keyboard commands: 
* 
* Key A) Increase the deltaZ value 
* 
* Key B) Decrease the deltaZ value 
* 
* Key C) Increase the deltaX value 
* 
* Key D) Decrease the deltaX value 
* 
* Key E) Increase the deltaY value 
* 
* Key F) Decrease the deltaY value 
* 
* @author Alessandro Martinelli 
*/ 
public class Practice11IlluminateGeometry extends JFrame implements KeyListener{ 

    private static float deltaZ=0; 
    private static float deltaX=0; 
    private static float deltaY=0; 


    public static void main(String[] args) { 
     Practice11IlluminateGeometry frame=new Practice11IlluminateGeometry(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public Practice11IlluminateGeometry(){ 
     setSize(600,600); 
     setTitle("Hello Universe"); 

     GraphicListener listener=new GraphicListener(); 
     GLCanvas canvas = new GLCanvas(new GLCapabilities()); 
     canvas.addGLEventListener(listener); 
     getContentPane().add(canvas); 

     Animator animator = new Animator(canvas); 
     animator.start(); 

     addKeyListener(this); 
    } 

    public class GraphicListener implements GLEventListener{ 


     public void display(GLAutoDrawable arg0) { 

      GL gl=arg0.getGL(); 
      gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

      gl.glEnable(GL.GL_DEPTH_TEST); 
      gl.glCullFace(GL.GL_FRONT); 
      gl.glEnable(GL.GL_CULL_FACE); 
      gl.glFrontFace(GL.GL_CW); 


      gl.glLoadIdentity(); 
      gl.glTranslatef(deltaX, deltaY, deltaZ); 

      gl.glColor3f(1,1,1); 
      gl.glBegin(GL.GL_TRIANGLE_STRIP); 

       gl.glNormal3f(0, 0, 1); 
       gl.glVertex3f(0,0,0); 
       gl.glVertex3f(0.3f,0,-0.4f); 
       gl.glVertex3f(0,0.3f,0); 
       gl.glVertex3f(0.3f,0.3f,0.4f); 
       gl.glVertex3f(0.3f,0.6f,0); 

      gl.glEnd(); 

     } 

     public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { 

     } 

     public void init(GLAutoDrawable arg0) { 

      GL gl=arg0.getGL(); 
      gl.glEnable(GL.GL_LIGHTING); 

      float ambient[]= {0.2f,0.2f,0.2f,1}; 
      gl.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT , ambient,0); 

      gl.glEnable(GL.GL_LIGHT0); 
      float position[]= {-0.4f,0.5f,0.7f,1}; 
      gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position, 0); 
      float intensity[]= {1,1,1,1}; 
      gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, intensity, 0); 

      gl.glEnable(GL.GL_LIGHT1); 
      float position2[]= {0,-0.8f,0.3f,1}; 
      gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, position2, 0); 
      float intensity2[]= {1,0,0,0}; 
      gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, intensity2, 0); 
      float specIntensity2[]= {1,1,1,1}; 
      gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, specIntensity2, 0); 


      gl.glEnable(GL.GL_COLOR_MATERIAL); 
      gl.glColorMaterial(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT_AND_DIFFUSE); 
      float specColor[]= {1,1,1,1}; 
      gl.glMaterialfv(GL.GL_FRONT_AND_BACK,GL.GL_SPECULAR, specColor,0); 
      gl.glMaterialf(GL.GL_FRONT_AND_BACK,GL.GL_SHININESS, 80); 
     } 

     public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) { 

     } 
    } 

    public void keyPressed(KeyEvent arg0) { 
     if(arg0.getKeyCode()==KeyEvent.VK_A){ 
      deltaZ+=0.05; 
     } 
     if(arg0.getKeyCode()==KeyEvent.VK_B){ 
      deltaZ-=0.05; 
     } 
     if(arg0.getKeyCode()==KeyEvent.VK_C){ 
      deltaX+=0.05; 
     } 
     if(arg0.getKeyCode()==KeyEvent.VK_D){ 
      deltaX-=0.05; 
     } 
     if(arg0.getKeyCode()==KeyEvent.VK_E){ 
      deltaY+=0.05; 
     } 
     if(arg0.getKeyCode()==KeyEvent.VK_F){ 
      deltaY-=0.05; 
     } 
    } 

    public void keyReleased(KeyEvent arg0) { 

    } 

    public void keyTyped(KeyEvent arg0) { 

    } 

    static final long serialVersionUID=100; 
} 

和我:

The import javax.media.opengl.GLCanvas cannot be resolved 
The import com.sun.opengl cannot be resolved 

,還有一些人(從其他項目) :

Texture cannot be resolved to a type 
Animator cannot be resolved to a type 

我猜這個jar不支持這些類型,爲什麼?有什麼辦法呢?

這很奇怪,因爲2.0版本假設支持版本1.0支持的所有東西,或者我錯了嗎?此外,這段代碼與jogl 1.0很好地工作,但我必須使用2.0版本。

回答

4

JOGL 1.1和2.0從javax.media.opengl變爲com.jogamp.opengl

對於兩種情況下JOGL項目的頂層包名稱列出的動畫類可以現在com.jogamp.opengl.util.Animator下找到與紋理現在是在封裝之間com.jogamp.opengl.util.texture.Texture

jogl的javadoc應該有助於找到你失蹤的其他課程。 https://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/

2

我用上面的例子作爲模板,並將它改編成Jogl 2.0。 請參閱下面的代碼:

import java.awt.*; 
import java.awt.event.*; 

import javax.media.opengl.GL; 
import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.awt.GLCanvas; 

import com.jogamp.opengl.util.Animator; 

public class IlluminateGeometry extends Frame implements KeyListener { 

    private static float deltaZ = 0.0f; 
    private static float deltaX = 0.0f; 
    private static float deltaY = 0.0f; 

    static GL2 gl; 

    static GLCanvas canvas; 
    static GLCapabilities capabilities; 
    static GLProfile profile; 
    static Animator animator; 

    public IlluminateGeometry() { 

    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
     animator.stop(); 
     dispose(); 
     System.exit(0); 
     } 
    }); 

    profile = GLProfile.getDefault(); 
    capabilities = new GLCapabilities(profile); 
    canvas = new GLCanvas(capabilities); 
    animator = new Animator(canvas); 
    GraphicListener graphiclistener = new GraphicListener(); 
    canvas.addGLEventListener(graphiclistener); 
    canvas.addKeyListener(this); 
    add(canvas, BorderLayout.CENTER); 

    animator.start(); 

    } 

    public class GraphicListener implements GLEventListener { 

    public void display(GLAutoDrawable drawable) { 
     gl = drawable.getGL().getGL2(); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

     // Enables clearing of the depth buffer 
     gl.glClearDepth(1.0f); 
     // Z-Buffer algorithm 
     gl.glEnable(GL2.GL_DEPTH_TEST); 
     // The type of depth test to do 
     gl.glDepthFunc(GL2.GL_LEQUAL); 
     gl.glCullFace(GL2.GL_FRONT); 
     gl.glEnable(GL2.GL_CULL_FACE); 
     gl.glFrontFace(GL2.GL_CW); 

     gl.glLoadIdentity(); 
     gl.glTranslatef(deltaX, deltaY, deltaZ); 
     gl.glColor3f(1.0f, 1.0f, 1.0f); 
     gl.glBegin(GL2.GL_TRIANGLE_STRIP); 
     gl.glNormal3f(0.0f, 0.0f, 1.0f); 
     gl.glVertex3f(0.0f, 0.0f, 0.0f); 
     gl.glVertex3f(0.3f, 0.0f, -0.4f); 
     gl.glVertex3f(0.0f, 0.3f, 0.0f); 
     gl.glVertex3f(0.3f, 0.3f, 0.4f); 
     gl.glVertex3f(0.3f, 0.6f, 0.0f); 
     gl.glEnd(); 
    } 

    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {} 

    public void init(GLAutoDrawable drawable) { 
     gl = drawable.getGL().getGL2(); 
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

     gl.glEnable(GL2.GL_LIGHTING); 
     float lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
     gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, lightAmbient, 0); 

     gl.glEnable(GL2.GL_LIGHT0); 
     float lightPosition[] = { -0.4f, 0.5f, 0.7f, 1.0f }; 
     gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosition, 0); 
     float lightIntensity[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
     gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, lightIntensity, 0); 

     gl.glEnable(GL2.GL_LIGHT1); 
     float lightPosition2[] = { 0.0f, -0.8f, 0.3f, 1.0f }; 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, lightPosition2, 0); 
     float lightIntensity2[] = { 1.0f, 0.0f, 0.0f, 0.0f }; 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_DIFFUSE, lightIntensity2, 0); 
     float lightSpecularIntensity2[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightSpecularIntensity2, 0); 

     gl.glEnable(GL2.GL_COLOR_MATERIAL); 
     gl.glColorMaterial(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT_AND_DIFFUSE); 
     float lightSpecularColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
     gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, lightSpecularColor, 0); 
     gl.glMaterialf(GL2.GL_FRONT_AND_BACK, GL2.GL_SHININESS, 80); 
    } 

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {} 

    public void dispose(GLAutoDrawable drawable) {} 

    } 

    public void keyTyped(KeyEvent key) {} 

    public void keyPressed(KeyEvent key) { 
    switch (key.getKeyCode()) { 
     case KeyEvent.VK_A: 
     deltaZ += 0.05; 
     break; 
     case KeyEvent.VK_B: 
     deltaZ -= 0.05; 
     break; 
     case KeyEvent.VK_C: 
     deltaX += 0.05; 
     break; 
     case KeyEvent.VK_D: 
     deltaX -= 0.05; 
     break; 
     case KeyEvent.VK_E: 
     deltaY += 0.05; 
     break; 
     case KeyEvent.VK_F: 
     deltaY -= 0.05; 
     break; 
     default: 
     break; 
    } 
    } 

    public void keyReleased(KeyEvent key) {} 

    public static void main(String[] args) { 
    IlluminateGeometry frame = new IlluminateGeometry(); 
    frame.setTitle("Illuminate Geometry"); 
    frame.setSize(640, 480); 
    frame.setVisible(true); 
    } 

}