在Bezier曲线opengl中绘制切线并垂直于每个点

时间:2016-09-30 18:48:07

标签: opengl math bezier

我目前通过将4度的某些贝塞尔曲线相加来生成贝塞尔曲线。我正在使用GL_LINES。我需要在每个Bezier点绘制正切,正规和副正规。

据我所知,要找到任意给定t值的正切,方程式为

P'(t) = 4 * (1-t)^3 *(P1 - P0) + 12 *(1-t)^2*t*(P2-P1) + 12 * (1-t) * t^2 * (P3-P2) + 4 * t^3 * (P4-P3)

我目前正以下列方式使用上述等式。

temp = 1-t;
tangentPoints[val].XYZW[j] = (4 * pow(temp, 3)*(V[k + 1].XYZW[j] - V[k].XYZW[j])) + (12 * pow(temp, 2)*t*(V[k + 2].XYZW[j] - V[k + 1].XYZW[j])) + (12 * (temp)*pow(t, 2)*(V[k + 3].XYZW[j] - V[k + 2].XYZW[j])) + (4 * pow(t, 3)*(V[k + 4].XYZW[j] - V[k + 3].XYZW[j])); 

其中j对应于x,y,z值,tangentPoints是我为顶点定义的结构。 V是控制点的顶点数组。

我只是在Bezier曲线上的点(比如x)之间绘制一条线,得到一个值t和它对应的切线值(比如说dx) 然而,当在(x,dx)之间绘制切线时,我得到类似的东西(从(x,dx)绘制一条线)。 Tangent generated by drawing a line between (x,dx)

但是当我将Bezier点添加到每个相应的切点时,我得到了正确的图像,即通过在(x,x + dx)之间画一条线来获得正确的结果

Drawing a line between (x,x+dx)

任何人都可以告诉我为什么会如此,并且提供了对给定贝塞尔点绘制正切和法线的见解。

1 个答案:

答案 0 :(得分:4)

虽然P'(t)有时被称为切线,但它实际上是曲线的导数,即速度。如果曲线在2d空间中并且其点以米为单位进行测量,那么P'(t)的单位将为米/秒。在' 5米之间划一条线是没有意义的。和#6; 6米/秒'因为它们是不同空间中的点

你应该做的是在曲线上的点之间绘制一条线'和'如果物体从曲线上脱离并继续以当前速度移动1秒钟,那么该物体就会出现。这是在P(t)P(t) + dt * P'(t)之间。