c++ - 在 OpenGL 中以固定速度沿贝塞尔曲线移动对象

标签 c++ logic bezier parameterization

我正在开发一个 OpenGL 项目,该项目仅使用二维数组创建贝塞尔曲线(顺序是起点 -> 开始控制点 -> 结束控制点 -> 结束):

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 秒,运动也会迅速加速。这显然不理想;我希望女孩的 Action 速度是固定的,理想情况下,我还希望能够选择执行 Action 的速度。我已尝试对这个公式进行很多调整,但无法解决这个问题,我将如何更改此代码以获得我正在寻找的结果?

最佳答案

查看您提供的公式的链接,您的方程式有误。第二项使用 3 + time 而它应该是 3 * time

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

在两个方程中。

关于c++ - 在 OpenGL 中以固定速度沿贝塞尔曲线移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290723/

相关文章:

objective-c - objective-c中的贝塞尔曲线算法

c++ - 使用来自无法访问类实现的外部 "plugin"库的 C++ 类引用

c# - 小数部分的最长循环 - 错误还是误解?

Prolog:考虑到项目可以恰好属于两个集合之一且集合大小已知的推论

解决平铺/拼图游戏的算法

javascript - 如何在动画帧上使用减速算法?

c++ - 如何使用 win32 c++ 在 Windows Mobile 6.5 中隐藏菜单?

c++ - 在 C++ 中,如果没有换行符,则不会打印字符串

c++ - 在 C++ 中返回假对象引用的规则

java - 使鼠标移动更人性化(使用圆弧而不是直线到达目的地)