我正在尝试围绕中心旋转一条线,并在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);
}
答案 0 :(得分:0)
掉期不是你想象的那样。它与缓冲区交换(从前到前)与v-blank的同步有关。
一般情况下,如果可以渲染60fps +,则需要保持打开状态。否则会关闭。
要每隔半秒实施一次画布清除,您应该通过在init()
long start = System.currentTimeMillis();
声明你想要的间隔
long interval = 500;
然后在display()
检查是否有时间更新:
if(System.currentTimeMillis() - start > interval) {
...
}
Ps:你使用的是deprecated Opengl,你应该学习当前的OpenGL。