【问题标题】:Moving An Object Along a Bezier Curve in OpenGL With Fixed Velocity在 OpenGL 中以固定速度沿贝塞尔曲线移动对象
【发布时间】:2018-03-15 02:41:26
【问题描述】:

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

【问题讨论】:

  • protip:缓存其中一些值,因为您重新计算所有这些系数的次数太多了。 t=time,mt=1-time,t2=t*t,mt2=mt*mt,t3=t*t*t,mt3=mt*mt*mt 现在您的代码更易于阅读并且您只需计算一次系数。计算 a=mt3,b=3*t*mt2,c=3*mt*t2,d=t3 的奖励积分,然后在你的 girlX/girlY 计算中使用这些积分。

标签: c++ logic bezier parameterization


【解决方案1】:

查看您提供的公式的链接,您的方程式有误。第二个词在应该是3 * time时使用3 + time

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

在两个方程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2011-12-06
    相关资源
    最近更新 更多