【问题标题】:Using linear interpolation to animate a line moving from point A to point B使用线性插值对从 A 点移动到 B 点的线进行动画处理
【发布时间】:2015-03-04 01:08:06
【问题描述】:
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();

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

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

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

以上是该技术的公式,但我将如何将其实现到我的 glut 应用程序中?

在网上找不到任何使用 GLUT 和 LERP 来演示动画的资源。

【问题讨论】:

    标签: opengl animation vector glut linear-interpolation


    【解决方案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();
    

    计算完点后,使用画线功能创建线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多