2015-03-23 7 views
0

Я пытаюсь анимировать круг по окну с координатами по умолчанию -1.0 < x < 1.0 и -1.0 < y < 1.0. Я генерирую случайное положение для круга и случайный угол, по которому он перемещается по окну.анимационный объект с glfw

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

гораздо проще, чем с использованием тригонометрии:

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; 
+0

Это не работает. Предположим, что исходная позиция равна x = 0.0. С увеличением таймера в положительном направлении. Как только x == 1.0, тогда x станет -1.0. Но таймер увеличивается, поэтому следующая итерация x = 1.1 (скажем), а затем x будет -1.1 и так далее. – mikeglaz

+0

, если x равно 1.1, тогда оно станет -0.9 –

+0

Это решение не обеспечивает непрерывность движения круга. Сразу после того, как центр круга пройдет границу, кружок появится на противоположной стороне. То, что вы можете сделать, это дублирование вашего круга. Используя решение храпового урода, когда центр проходит границу, позвольте одному из кругов двигаться и позвольте другому кругу появиться с противоположной стороны. –

0

Для того, чтобы получить более плавную анимацию, вы не должны использовать абсолютное значение таймера, но разница между последним значением и током, называемой дельтой.

Итак, я предлагаю вам изменить свой код для достижения этой цели:

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; 
Смежные вопросы