用glfw制作动画对象

时间:2015-03-23 13:24:58

标签: opengl glfw

我试图在窗口上设置一个圆圈的动画,该圆圈的默认坐标为-1.0&lt; x&lt; 1.0和-1.0 < y&lt; 1.0。我为圆圈生成一个随机位置,并在窗口上移动一个随机角度。

GLint modelLoc = glGetUniformLocation(program, "model");
GLfloat timer = glfwGetTime();
timer /= 10;

glm::mat4 model;
glm::vec3 position = circle.get_position();
GLfloat angle = glm::radians(circle.get_angle());

position.x += timer*cos(angle);
position.y += timer*sin(angle);   

model = glm::translate(model, position);
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
glDrawArrays(GL_LINE_LOOP, 0, NUM_CIRCLE_VERTICES);

现在,对象从其初始位置动画到屏幕外。我希望它到达边缘时出现在窗口的另一侧(即将x转换为-x)。我认为正弦函数在这里很有用,但我不太清楚如何实现它。

2 个答案:

答案 0 :(得分:0)

比使用trig简单得多:

if(position.x < -1)
    position.x+=2;
if(position.y < -1)
    position.y+=2;
if(position.x > 1)
    position.x-=2;
if(position.y > 1)
    position.y-=2;

答案 1 :(得分:0)

为了获得更流畅的动画,你不能使用计时器的绝对值,而是使用最后一个值和当前值之间的差值,称为delta。

因此,我建议您更改代码以实现此目的:

static GLfloast last = 0;
GLfloat delta;
GLfloat timer = glfwGetTime();
delta = timer - last;
last = timer;

...
position.x += delta*cos(angle);
position.y += delta*sin(angle);   

// using ratchet freak's solution
if(position.x < -1)
    position.x+=2;
if(position.y < -1)
    position.y+=2;
if(position.x > 1)
    position.x-=2;
if(position.y > 1)
    position.y-=2;