Перемещение объекта по кривой Безье в OpenGL с фиксированной скоростью

Я работаю над проектом OpenGL, который просто использует 2D-массив для создания кривой Безье (порядок — начальная точка -> начальная контрольная точка -> конечная контрольная точка -> конец):

GLfloat controlPointsGirl[numControlPointsGirl][3] = {
{1.0,0.0,0.0},{1.0,-0.5,0.0},{1.0,0.0,0.0},{-1.0,0.5,0.0}
};

И перемещает персонажа по этому пути с помощью следующей формулы, взятой из https://www.opengl.org/discussion_boards/showthread.php/136550-Moving-object-along-a-bezier-curve :

//Drawing, initializing, display refresh every timeInterval seconds, etc.

girlX = ((1 - time)*(1 - time)*(1 - time)*controlPointsGirl[0][0]
+ (3 + time*(1 - time)*(1 - time))* controlPointsGirl[1][0]
+ (3 * time*time*(1 - time))* controlPointsGirl[2][0]
+ time*time*time*controlPointsGirl[3][0])
/10;

cout << girlX <<" ";

girlY = ((1 - time)*(1 - time)*(1 - time)*controlPointsGirl[0][1]
+ (3 + time*(1 - time)*(1 - time))* controlPointsGirl[1][1]
+ (3 * time*time*(1 - time))* controlPointsGirl[2][1]
+ time*time*time*controlPointsGirl[3][1])
/10;

cout << girlY << endl;

time += timeInterval;

Проблема в том, что эта логика приводит к очень резким движениям, которые также быстро ускоряются, как только часы превышают 1 секунду. Это явно не идеально; Я хочу, чтобы скорость движения девушки была фиксированной, и в идеале я также хочу иметь возможность выбрать скорость, с которой будет выполняться движение. Я перепробовал много изменений в этой формуле, но у меня возникли проблемы с решением этой проблемы, как бы я изменил этот код для достижения результатов, которые я ищу?

0

Решение

Глядя на ссылку на формулу, которую вы предоставили, у вас есть ошибка в ваших уравнениях. Второй термин использует 3 + time когда это должно быть 3 * time

(3 * time*(1 - time)*(1 - time))* controlPointsGirl[1][0]

в обоих уравнениях.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]