使用线性插值为从A点移动到B点的直线设置动画

时间:2015-03-04 01:08:06

标签: opengl animation vector glut linear-interpolation

struct Point{
    float x;
    float y;
};

使用这个结构我制作了4个点,并为它们分配了值。然后使用Points的实例创建图片中显示的行。

PO.x = -0.5f;
PO.y = 0.5f;

P1.x = -1.0f;
P1.y = -0.5f;

Q0.x = 0.5;
Q0.y = -1.0f;

Q1.x = 0.7f;
Q1.y = 0.1f;

glPushMatrix();

glLineWidth(2.5);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2f(PO.x, PO.y);//PO
glVertex2f(P1.x, P1.y);//P1

glVertex2f(Q0.x, Q0.y);//QO
glVertex2f(Q1.x, Q1.y);//Q1
glEnd();

glPopMatrix();

Edited picture

虚线应该是从点P0到Q0的过渡,因此是第四个。

我所理解的是这种技术的概念LERP在两条线(或关键帧)之间创建中间帧。我不明白它是如何工作的。

x = x_start + ((x_final - x_start) * time)// where time is a value between zero and one

以上是此技术的公式,但我如何将其应用到我的过度应用程序中?

无法在线找到任何使用GLUT和LERP演示动画的资源。

1 个答案:

答案 0 :(得分:1)

每次没有用户输入时,都会调用idle函数。

void idle()
{

    timer += vec;
    cout << timer << endl;
    if (timer > 1){
        vec = 0;
    }
    glutPostRedisplay();
}

因为我有点我需要得到中间点,这是通过使用这个函数来完成的。

float interpolate(float startPos, float finalPos, float time) {
    return startPos + ((finalPos - startPos) * time);// ; 
}

此函数根据时间绘制直线上的点。

T0.x = interpolate(PO.x, Q0.x, timer);

T0是中间关键帧,我插入了我的线的起点和终点。因此插值。

如果没有计时器递增,它将不会产生&#34;动画&#34;

的效果
T0.x = interpolate(PO.x, Q0.x, timer);
T0.y = interpolate(PO.y, Q0.y, timer);

T1.x = interpolate(P1.x, Q1.x, timer);
T1.y = interpolate(P1.y, Q1.y, timer);


glPushMatrix();

glLineWidth(2.5);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2f(T0.x, T0.y);
glVertex2f(T1.x, T1.y);

glEnd();

计算点后,使用绘制线函数创建线。