在贝塞尔曲线opengl中绘制切线和法线到每个点

Draw tangents and normal to each point in Bezier curve opengl

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

据我所知,求任意给定 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是控制点的顶点数组。

我只是在贝塞尔曲线上的点(比如 x)为值 t 和它对应的切线值(比如 dx)之间画一条线 然而,在绘制 (x, dx) 之间的切线时,我得到了这样的结果(从 (x,dx) 绘制一条线)。

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

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

虽然 P'(t) 有时被称为切线,但它实际上是曲线的导数,也就是速度。如果曲线在 2d space 中并且其点以米为单位测量,例如,那么 P'(t) 的单位将在 meters/second 中。在'5米'和'6meters/second'之间画一条线是没有意义的,因为它们是不同spaces中的点。

你应该做的是在'the point on the curve'和'where the object would be if it was detached from the curve and continued to move at its current velocity for 1 second'之间画一条线。即在 P(t)P(t) + dt * P'(t) 之间。