2011-10-11 38 views
0

我剛剛在JOGL中寫了一個簡單的動畫:一個6色立方體圍繞y軸旋轉。但似乎我的動畫有一個小小的速度解決方法:有時它會加速,有時會減慢,儘管我只是用每次顯示調用時遞增的浮點變量(我的代碼如下)調用glRotate()。JOGL:我的立方體旋轉速度不規則

  • 我的處理器是奔騰雙核T3400
  • 我的操作系統是Xubuntu的11.04 32位
  • 我的顯卡是ATI的Radeon HD4330,我已經安裝了最新的專有驅動:11.6(下載AMD上網站,而不是在ubuntu軟件經理)

在Eclipse EDI(我使用靛藍3.7.0),這是多麼我已經把我的用戶庫:

  • 我已經下載了JOGL 2.0 beta 23(來自2011年3月03日),用於i586 linux
  • 在用戶庫中,我導入了以下jar包:newt.all.jar,nativewindow.all.jar,jogl.all。罐子,gluegen-rt.jar中
  • 所有進口罐子的鏈接到未經壓縮的檔案JOGL的lib子文件夾:在哪裏都是* .so文件

這裏我三類。

ArcballExperiment.java

package com.gmail.bernabe.laurent.jogl.arcball_experiment; 

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.media.opengl.awt.GLCanvas; 
import javax.swing.JFrame; 

import com.jogamp.opengl.util.Animator; 

public class ArcBallExperiment extends JFrame { 

    public ArcBallExperiment(){ 
     setTitle("ArcBall Experimentation"); 
     setSize(500, 500); 
     setLocationRelativeTo(null); 

     GLCanvas glCanvas = new GLCanvas(); 
     TheGLEventListener glEventListener = new TheGLEventListener(); 
     glCanvas.addGLEventListener(glEventListener); 
     add(glCanvas); 

     final Animator animator = new Animator(glCanvas); 
     addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       animator.stop(); 
       System.exit(0); 
      } 


     }); 

     animator.start(); 
    } 

    public static void main(String[] args) { 
     new ArcBallExperiment().setVisible(true); 
    } 

    private static final long serialVersionUID = 1L; 

} 

Cube.java:

package com.gmail.bernabe.laurent.jogl.arcball_experiment; 

import javax.media.opengl.GL2; 

public class Cube { 

    /** 
    * Draws a cube in a GL2 context 
    * @param gl - GL2 - GL2 context 
    */ 
    public static void draw(GL2 gl){ 
     gl.glBegin(GL2.GL_QUADS); 

      // front : blue 
      gl.glColor3f(0.0f, 0.0f, 1.0f); 
      gl.glVertex3f(-0.5f, +0.5f, +0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, +0.5f); 
      gl.glVertex3f(+0.5f, -0.5f, +0.5f); 
      gl.glVertex3f(+0.5f, +0.5f, +0.5f); 

      // back : green 
      gl.glColor3f(0.0f, 1.0f, 0.0f); 
      gl.glVertex3f(+0.5f, -0.5f, -0.5f); 
      gl.glVertex3f(+0.5f, +0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, +0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, -0.5f); 

      // left : red 
      gl.glColor3f(1.0f, 0.0f, 0.0f); 
      gl.glVertex3f(-0.5f, +0.5f, +0.5f); 
      gl.glVertex3f(-0.5f, +0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, +0.5f); 

      // right : orange 
      gl.glColor3f(1.0f, 0.4f, 0.0f); 
      gl.glVertex3f(+0.5f, +0.5f, -0.5f); 
      gl.glVertex3f(+0.5f, +0.5f, +0.5f); 
      gl.glVertex3f(+0.5f, -0.5f, +0.5f); 
      gl.glVertex3f(+0.5f, -0.5f, -0.5f); 

      // top : white 
      gl.glColor3f(1.0f, 1.0f, 1.0f); 
      gl.glVertex3f(+0.5f, +0.5f, +0.5f); 
      gl.glVertex3f(-0.5f, +0.5f, +0.5f); 
      gl.glVertex3f(-0.5f, +0.5f, -0.5f); 
      gl.glVertex3f(+0.5f, +0.5f, -0.5f); 

      // bottom : yellow 
      gl.glColor3f(1.0f, 1.0f, 0.0f); 
      gl.glVertex3f(+0.5f, -0.5f, +0.5f); 
      gl.glVertex3f(+0.5f, -0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, -0.5f); 
      gl.glVertex3f(-0.5f, -0.5f, +0.5f); 

     gl.glEnd(); 
    } 

} 

TheGLEventListener.java:

package com.gmail.bernabe.laurent.jogl.arcball_experiment; 

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.glu.gl2.GLUgl2; 

public class TheGLEventListener implements GLEventListener { 

    @Override 
    public void display(GLAutoDrawable drawable) { 
     GL2 gl = drawable.getGL().getGL2(); 
     gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 

     glu.gluLookAt(
       0f, 0f, 3f, 
       0f, 0f, 0f, 
       0f, 1f, 0f 
     ); 

     gl.glRotatef(rotationAngle, 0f, 1f, 0f); 
     Cube.draw(gl); 

     rotationAngle += 0.3f; 
     if (rotationAngle >= 360f) 
      rotationAngle %= 360f; 
    } 

    @Override 
    public void dispose(GLAutoDrawable drawable) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void init(GLAutoDrawable drawable) { 
     GL2 gl = drawable.getGL().getGL2(); 
     gl.glEnable(GL2.GL_DEPTH_TEST); 
     gl.glDepthFunc(GL2.GL_LEQUAL); 
     gl.glClearDepthf(1.0f); 
    } 

    @Override 
    public void reshape(GLAutoDrawable drawable, int x, int y, int width, 
      int height) { 
     GL2 gl = drawable.getGL().getGL2(); 
     gl.glViewport(x, y, width, height); 

     gl.glMatrixMode(GL2.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     glu.gluPerspective(60.0f, (float) width/height, 1f, 10f); 

     gl.glMatrixMode(GL2.GL_MODELVIEW); 
    } 

    private GLUgl2 glu = new GLUgl2(); 
    private float rotationAngle = 0f; 

} 

我想可能是因爲我在導入不兼容的罐子用戶庫爲我的JOGL eclipse項目,但我不知道。

在此先感謝

(標題軌跡球實驗似乎inapropriated,這是正確的:這個立方體旋轉是中庸之道,我再次想起之前去軌跡球實施JOGL編程階段。)

+0

最後,似乎問題可以通過強制FPS值來解決:我換成動畫由FPSAnimator =>的立方體轉動的不是「車」的任何更多。 – loloof64

+0

不錯的作品Laurent BERNABE。你能否自己發佈問題的答案,然後接受答案,以便我們能夠解決這個問題?另外,如果他們解決了您的問題,則需要接受以前問題的答案。 – Zecas

回答

3

最後我解決了這個問題:) 爲了保持恆定的FPS,我將動畫實例更改爲FPSAnimator而不是Animator。只有一個類更新: ArcBallExperiment.java

package com.gmail.bernabe.laurent.jogl.arcball_experiment; 

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.media.opengl.awt.GLCanvas; 
import javax.swing.JFrame; 

import com.jogamp.opengl.util.FPSAnimator; 

public class ArcBallExperiment extends JFrame { 

    public ArcBallExperiment(){ 
     setTitle("ArcBall Experimentation"); 
     setSize(500, 500); 
     setLocationRelativeTo(null); 

     GLCanvas glCanvas = new GLCanvas(); 
     TheGLEventListener glEventListener = new TheGLEventListener(); 
     glCanvas.addGLEventListener(glEventListener); 
     add(glCanvas); 

     /* 
     * Here I limit the FPS to a quite lower value than default, 
     * thanks to the FPSAnimator class : 180 FPS here. 
     * That way, cube rotation speed will really be constant 
     */ 
     final FPSAnimator animator = new FPSAnimator(glCanvas, 180); 
     addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       animator.stop(); 
       System.exit(0); 
      } 


     }); 

     animator.start(); 
    } 

    public static void main(String[] args) { 
     new ArcBallExperiment().setVisible(true); 
    } 

    private static final long serialVersionUID = 1L; 

}