首页 文章

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

提问于
浏览
0
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 回答

  • 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是中间关键帧,我插入了我的线的起点和终点 . 因此插值 .

    没有定时器递增,它不会产生“动画”的效果

    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();
    

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

相关问题