如何使用Animator在特定时间间隔后刷新opengl(Java JOGL)显示?

时间:2017-03-16 20:49:43

标签: java animation opengl jogl

我正在尝试围绕中心旋转一条线,并在java opengl中使用animator显示旋转。我想让动画更快地发生,即我想在每0.5秒后清除画布。我的猜测是 setSwapInterval 正在做技巧,但它只需要一个整数作为参数,所以我不能真正改变动画时间少于1个单位。

这应该很简单,但我无法弄清楚哪个参数实际控制了动画时间间隔。

我的全局变量:

double sec_theta = 0; 

动画师以主方法开始:

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

显示方法:

@Override
public void display(GLAutoDrawable drawable) {
    final GL2 gl = drawable.getGL().getGL2();
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
    sec_theta -=6;
    double r = .6;
    double x_center = 0;
    double y_center = 0;
    rotate_line(r,x_center,y_center,r-.1,0,gl);
}

这是绘图完成的地方:

public void rotate_line(double r,double x_center, double y_center,double sec_x, double sec_y, GL2 gl){
        double radian = Math.toRadians(sec_theta);
        double new_x = sec_x*Math.cos(radian)-sec_y*Math.sin(radian);
        double new_y = sec_x*Math.sin(radian)+sec_y*Math.cos(radian);
        double new_x_center = x_center*Math.cos(radian)-y_center*Math.sin(radian);
        double new_y_center = x_center*Math.sin(radian)+y_center*Math.cos(radian);
        drawHand(new_x_center,new_y_center,new_x,new_y,gl);
    }
public void drawHand(double x_center,double y_center,double end_x, double end_y, GL2 gl){
        gl.glBegin (GL2.GL_LINES);
        gl.glColor3f(1, 1, 1);
        gl.glVertex3d(x_center,y_center, 0);
        gl.glVertex3d(end_x,end_y, 0);
        gl.glEnd();
        gl.glFlush();
    }

init方法:

@Override
public void init(GLAutoDrawable drawable) {
    drawable.getGL().setSwapInterval(1);
}

1 个答案:

答案 0 :(得分:0)

掉期不是你想象的那样。它与缓冲区交换(从前到前)与v-blank的同步有关。

您可以阅读更多herehere

一般情况下,如果可以渲染60fps +,则需要保持打开状态。否则会关闭。

要每隔半秒实施一次画布清除,您应该通过在init()

中保存开始时间来手动实施
long start = System.currentTimeMillis();

声明你想要的间隔

long interval = 500;

然后在display()检查是否有时间更新:

if(System.currentTimeMillis() - start > interval) {
    ...
}

Ps:你使用的是deprecated Opengl,你应该学习当前的OpenGL。