【发布时间】: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