我试图在窗口上设置一个圆圈的动画,该圆圈的默认坐标为-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)。我认为正弦函数在这里很有用,但我不太清楚如何实现它。
答案 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;